Mercurial > mplayer.hg
annotate stream/tvi_v4l.c @ 36004:b81edd9d28ab
Move PIC detection to the front of PIE added.
It seems that clang turns off PIC when -fpie is set, which causes part
of ffmpeg failed to be compiled on OS X. In fact, in the configure of
ffmpeg, PIC is unconditionally enabled, which could be introduced as
ffmpeg seems to be an essential part of mplayer.
author | upsuper |
---|---|
date | Sat, 30 Mar 2013 03:32:16 +0000 |
parents | 389d43c448b3 |
children |
rev | line source |
---|---|
2802 | 1 /* |
30426
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
2 * Video 4 Linux input |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
3 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
4 * Copyright (C) 2001 Alex Beregszaszi |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
5 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
6 * Some ideas are based on xawtv/libng's grab-v4l.c written by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
7 * Gerd Knorr <kraxel@bytesex.org> |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
8 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
9 * Multithreading, a/v sync and native ALSA support by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
10 * Jindrich Makovicka <makovick@gmail.com> |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
11 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
12 * MJPEG hardware encoding support by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
13 * Ivan Szanto <szivan@freemail.hu> |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
14 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
15 * CODE IS UNDER DEVELOPMENT, NO FEATURE REQUESTS PLEASE! |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
16 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
17 * This file is part of MPlayer. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
18 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
19 * MPlayer is free software; you can redistribute it and/or modify |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
20 * it under the terms of the GNU General Public License as published by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
21 * the Free Software Foundation; either version 2 of the License, or |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
22 * (at your option) any later version. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
23 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
24 * MPlayer is distributed in the hope that it will be useful, |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
27 * GNU General Public License for more details. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
28 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
29 * You should have received a copy of the GNU General Public License along |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
30 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
31 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29809
diff
changeset
|
32 */ |
2802 | 33 |
2790 | 34 #include "config.h" |
35 | |
36 #include <stdio.h> | |
37 #include <errno.h> | |
38 #include <fcntl.h> | |
39 #include <sys/ioctl.h> | |
40 #include <sys/types.h> | |
6553
d000112bd06e
Paul Ortyl's patch - tv4l timestamps (not so precise :()
alex
parents:
6529
diff
changeset
|
41 #include <sys/time.h> |
10621
9f4af7d95d87
this small patch allows to compile the file libmpdemux/tvi_v4l.c properly,
diego
parents:
10593
diff
changeset
|
42 |
9f4af7d95d87
this small patch allows to compile the file libmpdemux/tvi_v4l.c properly,
diego
parents:
10593
diff
changeset
|
43 /* Necessary to prevent collisions between <linux/time.h> and <sys/time.h> when V4L2 is installed. */ |
9f4af7d95d87
this small patch allows to compile the file libmpdemux/tvi_v4l.c properly,
diego
parents:
10593
diff
changeset
|
44 #define _LINUX_TIME_H |
9f4af7d95d87
this small patch allows to compile the file libmpdemux/tvi_v4l.c properly,
diego
parents:
10593
diff
changeset
|
45 |
2790 | 46 #include <linux/videodev.h> |
47 #include <unistd.h> | |
48 #include <sys/mman.h> | |
2931 | 49 #include <stdlib.h> |
50 #include <string.h> | |
35903 | 51 #include <strings.h> |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
52 #include <pthread.h> |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
53 #ifdef HAVE_SYS_SYSINFO_H |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
54 #include <sys/sysinfo.h> |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
55 #endif |
2790 | 56 |
2830 | 57 #include "mp_msg.h" |
17012 | 58 #include "libaf/af_format.h" |
19431
ac69ba536915
Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents:
19271
diff
changeset
|
59 #include "libmpcodecs/img_format.h" |
29759
d287e2785570
Move teletext specific code from stream into libmpcodecs.
cehoyos
parents:
29263
diff
changeset
|
60 #include "libmpcodecs/dec_teletext.h" |
17012 | 61 #include "libvo/fastmemcpy.h" |
62 #include "libvo/videodev_mjpeg.h" | |
2830 | 63 |
2790 | 64 #include "tv.h" |
65 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
66 #include "audio_in.h" |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
67 |
23883 | 68 static tvi_handle_t *tvi_init_v4l(tv_param_t* tv_param); |
22381
6cabac4d35b5
tv driver loading rework. As a side effect "-tv driver=help" option is
voroshil
parents:
20646
diff
changeset
|
69 |
25689 | 70 const tvi_info_t tvi_info_v4l = { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
71 tvi_init_v4l, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
72 "Video 4 Linux input", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
73 "v4l", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
74 "Alex Beregszaszi", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
75 "under development" |
2802 | 76 }; |
77 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
78 #define PAL_WIDTH 768 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
79 #define PAL_HEIGHT 576 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
80 #define PAL_FPS 25 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
81 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
82 #define NTSC_WIDTH 640 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
83 #define NTSC_HEIGHT 480 |
16273 | 84 #define NTSC_FPS (30000.0/1001.0) |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
85 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
86 #define MAX_AUDIO_CHANNELS 10 |
3815 | 87 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
88 #define VID_BUF_SIZE_IMMEDIATE 2 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
89 #define VIDEO_AVG_BUFFER_SIZE 600 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
90 |
31322
016194f71de3
Fix function pointer types in tvi_functions struct
reimar
parents:
30426
diff
changeset
|
91 typedef struct priv { |
2802 | 92 /* general */ |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
93 char *video_device; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
94 int video_fd; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
95 struct video_capability capability; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
96 struct video_channel *channels; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
97 int act_channel; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
98 struct video_tuner tuner; |
2802 | 99 |
100 /* video */ | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
101 struct video_picture picture; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
102 int format; /* output format */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
103 int width; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
104 int height; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
105 int bytesperline; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
106 float fps; |
2802 | 107 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
108 struct video_mbuf mbuf; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
109 unsigned char *mmap; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
110 struct video_mmap *buf; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
111 int nbuf; |
2802 | 112 |
113 /* audio */ | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
114 char *audio_device; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
115 audio_in_t audio_in; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
116 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
117 int audio_id; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
118 struct video_audio audio[MAX_AUDIO_CHANNELS]; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
119 int audio_channels[MAX_AUDIO_CHANNELS]; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
120 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
121 /* buffering stuff */ |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
122 int immediate_mode; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
123 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
124 int audio_buffer_size; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
125 int aud_skew_cnt; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
126 unsigned char *audio_ringbuffer; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
127 long long *audio_skew_buffer; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
128 volatile int audio_head; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
129 volatile int audio_tail; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
130 volatile int audio_cnt; |
8131 | 131 volatile long long audio_skew; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
132 volatile double audio_skew_factor; |
8131 | 133 volatile long long audio_skew_measure_time; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
134 volatile int audio_drop; |
6553
d000112bd06e
Paul Ortyl's patch - tv4l timestamps (not so precise :()
alex
parents:
6529
diff
changeset
|
135 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
136 int first; |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
137 int video_buffer_size_max; |
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
138 volatile int video_buffer_size_current; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
139 unsigned char **video_ringbuffer; |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
140 long long *video_timebuffer; |
9607
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
141 long long *video_avg_buffer; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
142 int video_avg_ptr; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
143 int video_interval_sum; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
144 volatile int video_head; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
145 volatile int video_tail; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
146 volatile int video_cnt; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
147 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
148 volatile int shutdown; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
149 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
150 pthread_t audio_grabber_thread; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
151 pthread_t video_grabber_thread; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
152 pthread_mutex_t audio_starter; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
153 pthread_mutex_t skew_mutex; |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
154 pthread_mutex_t video_buffer_mutex; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
155 |
8131 | 156 long long starttime; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
157 double audio_secs_per_block; |
8131 | 158 long long audio_skew_total; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
159 long audio_recv_blocks_total; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
160 long audio_sent_blocks_total; |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
161 long mjpeg_bufsize; |
23926 | 162 char *vbi_dev; |
163 int vbi_fd; | |
164 int vbi_bufsize; | |
165 int vbi_shutdown; | |
166 pthread_t vbi_grabber_thread; | |
167 void *priv_vbi; | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
168 |
23883 | 169 tv_param_t *tv_param; |
2790 | 170 } priv_t; |
171 | |
172 #include "tvi_def.h" | |
173 | |
2841 | 174 static const char *device_cap2name[] = { |
2790 | 175 "capture", "tuner", "teletext", "overlay", "chromakey", "clipping", |
2802 | 176 "frameram", "scales", "monochrome", "subcapture", "mpeg-decoder", |
177 "mpeg-encoder", "mjpeg-decoder", "mjpeg-encoder", NULL | |
178 }; | |
179 | |
2841 | 180 static const char *device_palette2name[] = { |
2802 | 181 "-", "grey", "hi240", "rgb16", "rgb24", "rgb32", "rgb15", "yuv422", |
182 "yuyv", "uyvy", "yuv420", "yuv411", "raw", "yuv422p", "yuv411p", | |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
183 "yuv420p", "yuv410p" |
2802 | 184 }; |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
185 #define PALETTE(x) ((x < sizeof(device_palette2name)/sizeof(char*)) ? device_palette2name[x] : "UNKNOWN") |
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
186 |
24789
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
187 static const struct { |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
188 char* name; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
189 int normid; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
190 int tuner_flags; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
191 int tuner_mode; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
192 int input_norm; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
193 float fps; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
194 } supported_norms[]={ |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
195 {"pal", TV_NORM_PAL, VIDEO_TUNER_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, PAL_FPS }, |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
196 {"ntsc", TV_NORM_NTSC, VIDEO_TUNER_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, NTSC_FPS}, |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
197 {"secam", TV_NORM_SECAM, VIDEO_TUNER_SECAM, VIDEO_MODE_SECAM,VIDEO_MODE_SECAM,PAL_FPS }, |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
198 {"palnc", TV_NORM_PALNC, VIDEO_TUNER_PAL, VIDEO_MODE_PAL, 3, PAL_FPS }, |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
199 {"palm", TV_NORM_PALM, VIDEO_TUNER_NTSC, VIDEO_MODE_NTSC, 4, NTSC_FPS}, |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
200 {"paln", TV_NORM_PALN, VIDEO_TUNER_PAL, VIDEO_MODE_PAL, 5, PAL_FPS }, |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
201 {"ntscjp",TV_NORM_NTSCJP, VIDEO_TUNER_NTSC, VIDEO_MODE_NTSC, 6, NTSC_FPS}, |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
202 {"auto", -1, -1, -1, VIDEO_MODE_AUTO, -1 }, |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
203 {NULL, -1, -1, -1, -1 } |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
204 }; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
205 |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
206 static const char *norm2name(int mode) |
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
207 { |
24789
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
208 int i; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
209 for(i=0;supported_norms[i].name; i++) |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
210 if(supported_norms[i].input_norm==mode) |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
211 return supported_norms[i].name; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
212 return "unknown"; |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
213 }; |
2802 | 214 |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
215 static const char *audio_mode2name(int mode) |
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
216 { |
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
217 switch (mode) { |
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
218 case VIDEO_SOUND_MONO: |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
219 return "mono"; |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
220 case VIDEO_SOUND_STEREO: |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
221 return "stereo"; |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
222 case VIDEO_SOUND_LANG1: |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
223 return "language1"; |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
224 case VIDEO_SOUND_LANG2: |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
225 return "language2"; |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
226 default: |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
227 return "unknown"; |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
228 } |
2841 | 229 }; |
230 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
231 static void *audio_grabber(void *data); |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
232 static void *video_grabber(void *data); |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
233 |
2802 | 234 static int palette2depth(int palette) |
235 { | |
2810 | 236 switch(palette) |
237 { | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
238 /* component */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
239 case VIDEO_PALETTE_RGB555: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
240 return 15; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
241 case VIDEO_PALETTE_RGB565: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
242 return 16; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
243 case VIDEO_PALETTE_RGB24: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
244 return 24; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
245 case VIDEO_PALETTE_RGB32: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
246 return 32; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
247 /* planar */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
248 case VIDEO_PALETTE_YUV411P: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
249 case VIDEO_PALETTE_YUV420P: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
250 case VIDEO_PALETTE_YUV410P: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
251 return 12; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
252 /* packed */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
253 case VIDEO_PALETTE_YUV422P: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
254 case VIDEO_PALETTE_YUV422: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
255 case VIDEO_PALETTE_YUYV: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
256 case VIDEO_PALETTE_UYVY: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
257 case VIDEO_PALETTE_YUV420: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
258 case VIDEO_PALETTE_YUV411: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
259 return 16; |
2810 | 260 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
261 return -1; |
2802 | 262 } |
263 | |
264 static int format2palette(int format) | |
265 { | |
2810 | 266 switch(format) |
267 { | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
268 case IMGFMT_BGR15: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
269 return VIDEO_PALETTE_RGB555; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
270 case IMGFMT_BGR16: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
271 return VIDEO_PALETTE_RGB565; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
272 case IMGFMT_BGR24: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
273 return VIDEO_PALETTE_RGB24; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
274 case IMGFMT_BGR32: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
275 return VIDEO_PALETTE_RGB32; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
276 case IMGFMT_YV12: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
277 case IMGFMT_I420: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
278 return VIDEO_PALETTE_YUV420P; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
279 case IMGFMT_YUY2: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
280 return VIDEO_PALETTE_YUV422; |
11656
1bd451a6d4ae
make outfmt=uyvy work with rivatv patch by Stephen Beahm
faust3
parents:
10776
diff
changeset
|
281 case IMGFMT_UYVY: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
282 return VIDEO_PALETTE_UYVY; |
2810 | 283 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
284 return -1; |
2802 | 285 } |
286 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
287 // sets and sanitizes audio buffer/block sizes |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
288 static void setup_audio_buffer_sizes(priv_t *priv) |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
289 { |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
290 int bytes_per_sample = priv->audio_in.bytes_per_sample; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
291 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
292 // make the audio buffer at least 5 seconds long |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
293 priv->audio_buffer_size = 1 + 5*priv->audio_in.samplerate |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
294 *priv->audio_in.channels |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
295 *bytes_per_sample/priv->audio_in.blocksize; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
296 if (priv->audio_buffer_size < 256) priv->audio_buffer_size = 256; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
297 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
298 // make the skew buffer at least 1 second long |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
299 priv->aud_skew_cnt = 1 + 1*priv->audio_in.samplerate |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
300 *priv->audio_in.channels |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
301 *bytes_per_sample/priv->audio_in.blocksize; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
302 if (priv->aud_skew_cnt < 16) priv->aud_skew_cnt = 16; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
303 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
304 mp_msg(MSGT_TV, MSGL_V, "Audio capture - buffer %d blocks of %d bytes, skew average from %d meas.\n", |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
305 priv->audio_buffer_size, priv->audio_in.blocksize, priv->aud_skew_cnt); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
306 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
307 |
23883 | 308 static tvi_handle_t *tvi_init_v4l(tv_param_t* tv_param) |
2790 | 309 { |
310 tvi_handle_t *h; | |
311 priv_t *priv; | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
312 |
32141
2802b8095bf7
Move TV input new_handle static function to tv.c and make it non-static.
diego
parents:
32090
diff
changeset
|
313 h = tv_new_handle(sizeof(priv_t), &functions); |
2790 | 314 if (!h) |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
315 return NULL; |
2790 | 316 |
317 priv = h->priv; | |
318 | |
2802 | 319 /* set video device name */ |
23883 | 320 if (!tv_param->device) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
321 priv->video_device = strdup("/dev/video0"); |
2790 | 322 else |
23883 | 323 priv->video_device = strdup(tv_param->device); |
3611 | 324 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
325 /* set video device name */ |
23883 | 326 if (!tv_param->adevice) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
327 priv->audio_device = NULL; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
328 else { |
23883 | 329 priv->audio_device = strdup(tv_param->adevice); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
330 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
331 |
3611 | 332 /* allocation failed */ |
333 if (!priv->video_device) { | |
32090
535ebcd085e4
Move TV input free_handle static function to tv.c and make it non-static.
diego
parents:
31834
diff
changeset
|
334 tv_free_handle(h); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
335 return NULL; |
2790 | 336 } |
337 | |
23925
f54903679ad0
10l: wrong pointer was initialized (causes crash during startup).
voroshil
parents:
23885
diff
changeset
|
338 priv->tv_param=tv_param; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
339 return h; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
340 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
341 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
342 /* retrieves info about audio channels from the BTTV */ |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
343 static void init_v4l_audio(priv_t *priv) |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
344 { |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
345 int i; |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
346 int reqmode; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
347 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
348 if (!priv->capability.audios) return; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
349 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
350 /* audio chanlist */ |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
351 |
7318
85897ab199a4
changed message leveles (too many non-sense info messages)
alex
parents:
7317
diff
changeset
|
352 mp_msg(MSGT_TV, MSGL_V, " Audio devices: %d\n", priv->capability.audios); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
353 |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
354 mp_msg(MSGT_TV, MSGL_V, "Video capture card reports the audio setup as follows:\n"); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
355 for (i = 0; i < priv->capability.audios; i++) |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
356 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
357 if (i >= MAX_AUDIO_CHANNELS) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
358 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
359 mp_msg(MSGT_TV, MSGL_ERR, "no space for more audio channels (increase in source!) (%d > %d)\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
360 i, MAX_AUDIO_CHANNELS); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
361 i = priv->capability.audios; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
362 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
363 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
364 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
365 priv->audio[i].audio = i; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
366 if (ioctl(priv->video_fd, VIDIOCGAUDIO, &priv->audio[i]) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
367 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
368 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get audio failed: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
369 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
370 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
371 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
372 /* mute all channels */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
373 priv->audio[i].flags |= VIDEO_AUDIO_MUTE; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
374 reqmode = -1; |
23885 | 375 if (priv->tv_param->amode >= 0) { |
376 switch (priv->tv_param->amode) { | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
377 case 0: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
378 reqmode = VIDEO_SOUND_MONO; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
379 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
380 case 1: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
381 reqmode = VIDEO_SOUND_STEREO; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
382 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
383 case 2: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
384 reqmode = VIDEO_SOUND_LANG1; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
385 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
386 case 3: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
387 reqmode = VIDEO_SOUND_LANG2; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
388 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
389 default: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
390 mp_msg(MSGT_TV, MSGL_ERR, "Unknown audio mode requested.\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
391 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
392 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
393 if (reqmode >= 0) priv->audio[i].mode = reqmode; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
394 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
395 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]); |
3815 | 396 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
397 // get the parameters back |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
398 if (ioctl(priv->video_fd, VIDIOCGAUDIO, &priv->audio[i]) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
399 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
400 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get audio failed: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
401 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
402 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
403 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
404 switch(priv->audio[i].mode) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
405 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
406 case VIDEO_SOUND_MONO: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
407 case VIDEO_SOUND_LANG1: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
408 case VIDEO_SOUND_LANG2: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
409 priv->audio_channels[i] = 1; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
410 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
411 case VIDEO_SOUND_STEREO: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
412 priv->audio_channels[i] = 2; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
413 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
414 default: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
415 mp_msg(MSGT_TV, MSGL_ERR, "Card reports an unknown audio mode !\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
416 mp_msg(MSGT_TV, MSGL_ERR, "Trying two channel audio. Use forcechan to override.\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
417 priv->audio_channels[i] = 2; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
418 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
419 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
420 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
421 if (reqmode >= 0 && priv->audio[i].mode != reqmode) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
422 mp_msg(MSGT_TV, MSGL_ERR, "Audio mode setup warning!\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
423 mp_msg(MSGT_TV, MSGL_ERR, "Requested mode was %s, but v4l still reports %s.\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
424 audio_mode2name(reqmode), audio_mode2name(priv->audio[i].mode)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
425 mp_msg(MSGT_TV, MSGL_ERR, "You may need \"forcechan\" option to force stereo/mono audio recording.\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
426 } |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
427 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
428 /* display stuff */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
429 mp_msg(MSGT_TV, MSGL_V, " %d: %s: ", priv->audio[i].audio, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
430 priv->audio[i].name); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
431 if (priv->audio[i].flags & VIDEO_AUDIO_MUTABLE) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
432 mp_msg(MSGT_TV, MSGL_V, "muted=%s ", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
433 (priv->audio[i].flags & VIDEO_AUDIO_MUTE) ? "yes" : "no"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
434 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
435 mp_msg(MSGT_TV, MSGL_V, "vol=%d bass=%d treble=%d balance=%d mode=%s", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
436 priv->audio[i].volume, priv->audio[i].bass, priv->audio[i].treble, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
437 priv->audio[i].balance, audio_mode2name(priv->audio[i].mode)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
438 mp_msg(MSGT_TV, MSGL_V, " chan=%d\n", priv->audio_channels[i]); |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
439 |
23885 | 440 if (priv->tv_param->forcechan >= 0) |
441 priv->audio_channels[i] = priv->tv_param->forcechan; | |
7163
a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
alex
parents:
7070
diff
changeset
|
442 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
443 // we'll call VIDIOCSAUDIO again when starting capture |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
444 // let's set audio mode to requested mode again for the case |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
445 // when VIDIOCGAUDIO just cannot report the mode correctly |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
446 if (reqmode >= 0) priv->audio[i].mode = reqmode; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
447 } |
2790 | 448 } |
449 | |
11814 | 450 #if !defined(__LINUX_VIDEODEV2_H) && !defined(VIDIOC_QUERYCAP) |
10593 | 451 struct v4l2_capability |
452 { | |
453 __u8 driver[16]; /* i.e. "bttv" */ | |
454 __u8 card[32]; /* i.e. "Hauppauge WinTV" */ | |
455 __u8 bus_info[32]; /* "PCI:" + pci_dev->slot_name */ | |
456 __u32 version; /* should use KERNEL_VERSION() */ | |
457 __u32 capabilities; /* Device capabilities */ | |
458 __u32 reserved[4]; | |
459 }; | |
460 | |
461 #define VIDIOC_QUERYCAP _IOR ('V', 0, struct v4l2_capability) | |
10621
9f4af7d95d87
this small patch allows to compile the file libmpdemux/tvi_v4l.c properly,
diego
parents:
10593
diff
changeset
|
462 #endif |
10593 | 463 |
3815 | 464 static int init(priv_t *priv) |
2790 | 465 { |
466 int i; | |
467 | |
23885 | 468 if (priv->tv_param->immediate == 1) |
469 priv->tv_param->noaudio = 1; | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
470 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
471 priv->video_ringbuffer = NULL; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
472 priv->video_timebuffer = NULL; |
9607
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
473 priv->video_avg_buffer = NULL; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
474 priv->audio_ringbuffer = NULL; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
475 priv->audio_skew_buffer = NULL; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
476 |
3815 | 477 priv->video_fd = open(priv->video_device, O_RDWR); |
17366 | 478 mp_msg(MSGT_TV, MSGL_DBG2, "Video fd: %d, %p\n", priv->video_fd, |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
479 priv->video_device); |
3815 | 480 if (priv->video_fd == -1) |
2790 | 481 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
482 mp_msg(MSGT_TV, MSGL_ERR, "unable to open '%s': %s\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
483 priv->video_device, strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
484 goto err; |
2790 | 485 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
486 |
10593 | 487 /* check for v4l2 */ |
488 if (ioctl(priv->video_fd, VIDIOC_QUERYCAP, &priv->capability) == 0) { | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
489 mp_msg(MSGT_TV, MSGL_ERR, "=================================================================\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
490 mp_msg(MSGT_TV, MSGL_ERR, " WARNING: YOU ARE USING V4L DEMUXER WITH V4L2 DRIVERS!!!\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
491 mp_msg(MSGT_TV, MSGL_ERR, " As the V4L1 compatibility layer is broken, this may not work.\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
492 mp_msg(MSGT_TV, MSGL_ERR, " If you encounter any problems, use driver=v4l2 instead.\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
493 mp_msg(MSGT_TV, MSGL_ERR, " Bugreports on driver=v4l with v4l2 drivers will be ignored.\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
494 mp_msg(MSGT_TV, MSGL_ERR, "=================================================================\n"); |
10593 | 495 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
496 |
2802 | 497 /* get capabilities (priv->capability is needed!) */ |
3815 | 498 if (ioctl(priv->video_fd, VIDIOCGCAP, &priv->capability) == -1) |
2790 | 499 { |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31322
diff
changeset
|
500 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get capabilities failed: %s\n", strerror(errno)); |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
501 goto err; |
2790 | 502 } |
503 | |
3815 | 504 fcntl(priv->video_fd, F_SETFD, FD_CLOEXEC); |
2802 | 505 |
2818 | 506 mp_msg(MSGT_TV, MSGL_INFO, "Selected device: %s\n", priv->capability.name); |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31322
diff
changeset
|
507 mp_msg(MSGT_TV, MSGL_INFO, " Capabilities: "); |
2841 | 508 for (i = 0; device_cap2name[i] != NULL; i++) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
509 if (priv->capability.type & (1 << i)) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
510 mp_msg(MSGT_TV, MSGL_INFO, "%s ", device_cap2name[i]); |
2818 | 511 mp_msg(MSGT_TV, MSGL_INFO, "\n"); |
512 mp_msg(MSGT_TV, MSGL_INFO, " Device type: %d\n", priv->capability.type); | |
513 mp_msg(MSGT_TV, MSGL_INFO, " Supported sizes: %dx%d => %dx%d\n", | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
514 priv->capability.minwidth, priv->capability.minheight, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
515 priv->capability.maxwidth, priv->capability.maxheight); |
2790 | 516 priv->width = priv->capability.minwidth; |
517 priv->height = priv->capability.minheight; | |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
518 |
23885 | 519 /* somewhere here could disable priv->tv_param->mjpeg, if it is not a capability */ |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
520 |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
521 /* initialize if necessary */ |
23885 | 522 if ( priv->tv_param->mjpeg ) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
523 { |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
524 struct mjpeg_params bparm; |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
525 struct mjpeg_requestbuffers breq; /* buffer requests */ |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
526 |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
527 if (ioctl(priv->video_fd, MJPIOC_G_PARAMS, &bparm) < 0) |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
528 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
529 mp_msg(MSGT_TV, MSGL_ERR, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
530 " MJP: Error getting video parameters: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
531 goto err; |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
532 } |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
533 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
534 mp_msg(MSGT_TV, MSGL_INFO, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
535 " MJP: previous params: x: %d, y: %d, w: %d, h: %d, decim: %d, fields: %d,\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
536 bparm.img_x, bparm.img_y, bparm.img_width, bparm.img_height, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
537 bparm.decimation, bparm.field_per_buff); |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
538 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
539 mp_msg(MSGT_TV, MSGL_INFO, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
540 " MJP: HorDcm: %d, VerDcm: %d, TmpDcm: %d\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
541 bparm.HorDcm, bparm.VerDcm, bparm.TmpDcm); |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
542 |
23885 | 543 bparm.input = priv->tv_param->input; /* tv */ |
544 if (!strcasecmp(priv->tv_param->norm, "pal")) | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
545 bparm.norm = 0; /* PAL */ |
23885 | 546 else if (!strcasecmp(priv->tv_param->norm, "ntsc")) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
547 bparm.norm = 1; /* NTSC */ |
23885 | 548 else if (!strcasecmp(priv->tv_param->norm, "secam")) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
549 bparm.norm = 2; /* SECAM */ |
23885 | 550 bparm.quality = priv->tv_param->quality; |
551 bparm.decimation = priv->tv_param->decimation; | |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
552 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
553 mp_msg(MSGT_TV, MSGL_INFO, " MJP: setting params to decimation: %d, quality: %d\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
554 bparm.decimation, bparm.quality); |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
555 |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
556 if (ioctl(priv->video_fd, MJPIOC_S_PARAMS, &bparm) < 0) |
23149 | 557 { |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
558 mp_msg(MSGT_TV, MSGL_ERR, |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
559 " MJP: Error setting video parameters: %s\n", strerror(errno)); |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
560 goto err; |
23149 | 561 } |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
562 |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
563 if (ioctl(priv->video_fd, MJPIOC_G_PARAMS, &bparm) < 0) |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
564 { |
23149 | 565 mp_msg(MSGT_TV, MSGL_ERR, |
566 " MJP: Error getting video parameters: %s\n", strerror(errno)); | |
567 goto err; | |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
568 } |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
569 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
570 mp_msg(MSGT_TV, MSGL_INFO, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
571 " MJP: current params: x: %d, y: %d, w: %d, h: %d, decim: %d, fields: %d,\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
572 bparm.img_x, bparm.img_y, bparm.img_width, bparm.img_height, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
573 bparm.decimation, bparm.field_per_buff); |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
574 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
575 mp_msg(MSGT_TV, MSGL_INFO, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
576 " MJP: HorDcm: %d, VerDcm: %d, TmpDcm: %d\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
577 bparm.HorDcm, bparm.VerDcm, bparm.TmpDcm); |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
578 |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
579 |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
580 breq.count = 64; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
581 priv -> nbuf = breq.count; |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
582 priv->mbuf.frames = priv -> nbuf; |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
583 priv->mjpeg_bufsize = 256*1024; |
23885 | 584 if (priv->tv_param->buffer_size >= 0) |
585 priv->mjpeg_bufsize = priv->tv_param->buffer_size*1024; | |
23142
4978352462a0
cosmetics: Fix one more stray wrongly indented line.
diego
parents:
23141
diff
changeset
|
586 breq.size = priv -> mjpeg_bufsize; |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
587 if (ioctl(priv->video_fd, MJPIOC_REQBUFS,&(breq)) < 0) |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
588 { |
23149 | 589 mp_msg (MSGT_TV, MSGL_ERR, |
590 " MJP: Error requesting video buffers: %s\n", strerror(errno)); | |
591 goto err; | |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
592 } |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
593 mp_msg(MSGT_TV, MSGL_INFO, |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
594 " MJP: Got %ld buffers of size %ld KB\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
595 breq.count, breq.size/1024); |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
596 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
597 priv -> mmap = mmap(0, breq.count * breq.size, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
598 PROT_READ|PROT_WRITE, MAP_SHARED, priv->video_fd, 0); |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
599 if (priv -> mmap == MAP_FAILED) |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
600 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
601 mp_msg(MSGT_TV, MSGL_INFO, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
602 " MJP: Error mapping video buffers: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
603 goto err; |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
604 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
605 } |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
606 |
2818 | 607 mp_msg(MSGT_TV, MSGL_INFO, " Inputs: %d\n", priv->capability.channels); |
18885 | 608 priv->channels = calloc(priv->capability.channels, sizeof(struct video_channel)); |
3611 | 609 if (!priv->channels) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
610 goto malloc_failed; |
2790 | 611 memset(priv->channels, 0, sizeof(struct video_channel)*priv->capability.channels); |
612 for (i = 0; i < priv->capability.channels; i++) | |
613 { | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
614 priv->channels[i].channel = i; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
615 if (ioctl(priv->video_fd, VIDIOCGCHAN, &priv->channels[i]) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
616 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
617 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get channel failed: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
618 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
619 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
620 mp_msg(MSGT_TV, MSGL_INFO, " %d: %s: %s%s%s%s (tuner:%d, norm:%s)\n", i, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
621 priv->channels[i].name, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
622 (priv->channels[i].flags & VIDEO_VC_TUNER) ? "tuner " : "", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
623 (priv->channels[i].flags & VIDEO_VC_AUDIO) ? "audio " : "", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
624 (priv->channels[i].flags & VIDEO_TYPE_TV) ? "tv " : "", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
625 (priv->channels[i].flags & VIDEO_TYPE_CAMERA) ? "camera " : "", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
626 priv->channels[i].tuners, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
627 norm2name(priv->channels[i].norm)); |
2802 | 628 } |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
629 priv->act_channel = 0; |
2802 | 630 |
631 if (!(priv->capability.type & VID_TYPE_CAPTURE)) | |
632 { | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
633 mp_msg(MSGT_TV, MSGL_ERR, "Only grabbing supported (for overlay use another program)\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
634 goto err; |
2802 | 635 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
636 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
637 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
638 /* init v4l audio even when we don't capture */ |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
639 init_v4l_audio(priv); |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
640 |
23885 | 641 if (!priv->capability.audios && !priv->tv_param->force_audio) priv->tv_param->noaudio = 1; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
642 |
3815 | 643 /* audio init */ |
23885 | 644 if (!priv->tv_param->noaudio) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
645 |
27390
9d95dc936e66
Introduce CONFIG_ALSA preprocessor directive for ALSA 0.9 and 1.x.
diego
parents:
27387
diff
changeset
|
646 #ifdef CONFIG_ALSA |
23885 | 647 if (priv->tv_param->alsa) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
648 audio_in_init(&priv->audio_in, AUDIO_IN_ALSA); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
649 else |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
650 audio_in_init(&priv->audio_in, AUDIO_IN_OSS); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
651 #else |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
652 audio_in_init(&priv->audio_in, AUDIO_IN_OSS); |
3815 | 653 #endif |
654 | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
655 if (priv->audio_device) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
656 audio_in_set_device(&priv->audio_in, priv->audio_device); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
657 } |
7070
aaac9080b8a3
v4l capture update by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
7058
diff
changeset
|
658 |
23885 | 659 if (priv->tv_param->audio_id < priv->capability.audios) |
660 priv->audio_id = priv->tv_param->audio_id; | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
661 else |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
662 priv->audio_id = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
663 audio_in_set_samplerate(&priv->audio_in, 44100); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
664 if (priv->capability.audios) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
665 audio_in_set_channels(&priv->audio_in, priv->audio_channels[priv->audio_id]); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
666 } else { |
23885 | 667 if (priv->tv_param->forcechan >= 0) { |
668 audio_in_set_channels(&priv->audio_in, priv->tv_param->forcechan); | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
669 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
670 audio_in_set_channels(&priv->audio_in, 2); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
671 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
672 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
673 if (audio_in_setup(&priv->audio_in) < 0) return 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
674 setup_audio_buffer_sizes(priv); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
675 } |
3815 | 676 |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
677 return 1; |
2790 | 678 |
3611 | 679 malloc_failed: |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32352
diff
changeset
|
680 free(priv->channels); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32352
diff
changeset
|
681 free(priv->buf); |
2790 | 682 err: |
3815 | 683 if (priv->video_fd != -1) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
684 close(priv->video_fd); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
685 return 0; |
2790 | 686 } |
687 | |
2802 | 688 static int uninit(priv_t *priv) |
2790 | 689 { |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
690 unsigned long num; |
23926 | 691 |
692 priv->vbi_shutdown=1; | |
693 if(priv->vbi_grabber_thread) | |
694 pthread_join(priv->vbi_grabber_thread, NULL); | |
695 | |
696 teletext_control(priv->priv_vbi,TV_VBI_CONTROL_STOP,(void*)1); | |
697 priv->priv_vbi=NULL; | |
698 | |
699 if(priv->vbi_fd){ | |
700 close(priv->vbi_fd); | |
701 priv->vbi_fd=0; | |
702 } | |
703 | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32352
diff
changeset
|
704 free(priv->vbi_dev); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32352
diff
changeset
|
705 priv->vbi_dev = NULL; |
23926 | 706 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
707 priv->shutdown = 1; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
708 |
7318
85897ab199a4
changed message leveles (too many non-sense info messages)
alex
parents:
7317
diff
changeset
|
709 mp_msg(MSGT_TV, MSGL_V, "Waiting for threads to finish... "); |
23885 | 710 if (!priv->tv_param->noaudio) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
711 pthread_join(priv->audio_grabber_thread, NULL); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
712 pthread_mutex_destroy(&priv->audio_starter); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
713 pthread_mutex_destroy(&priv->skew_mutex); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
714 } |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
715 pthread_mutex_destroy(&priv->video_buffer_mutex); |
24759
cdd41bcc9603
Fix mplayer segfault when v4l driver initialization (at setting norm
voroshil
parents:
24105
diff
changeset
|
716 if(priv->video_grabber_thread) |
cdd41bcc9603
Fix mplayer segfault when v4l driver initialization (at setting norm
voroshil
parents:
24105
diff
changeset
|
717 pthread_join(priv->video_grabber_thread, NULL); |
cdd41bcc9603
Fix mplayer segfault when v4l driver initialization (at setting norm
voroshil
parents:
24105
diff
changeset
|
718 |
7318
85897ab199a4
changed message leveles (too many non-sense info messages)
alex
parents:
7317
diff
changeset
|
719 mp_msg(MSGT_TV, MSGL_V, "done\n"); |
3815 | 720 |
8703 | 721 if (priv->capability.audios) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
722 priv->audio[priv->audio_id].flags |= VIDEO_AUDIO_MUTE; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
723 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]); |
8703 | 724 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
725 |
23885 | 726 if ( priv->tv_param->mjpeg ) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
727 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
728 num = -1; |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
729 if (ioctl(priv->video_fd, MJPIOC_QBUF_CAPT, &num) < 0) |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
730 mp_msg(MSGT_TV, MSGL_ERR, "\n MJP: ioctl MJPIOC_QBUF_CAPT failed: %s\n", strerror(errno)); |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
731 } |
9745 | 732 else |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
733 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
734 // We need to munmap as close don't close mem mappings |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
735 if(munmap(priv->mmap,priv->mbuf.size)) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
736 mp_msg(MSGT_TV, MSGL_ERR, "Munmap failed: %s\n",strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
737 } |
9745 | 738 |
739 if(close(priv->video_fd)) | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
740 mp_msg(MSGT_TV, MSGL_ERR, "Close tv failed: %s\n",strerror(errno)); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
741 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
742 audio_in_uninit(&priv->audio_in); |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
743 |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
744 if (priv->video_ringbuffer) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
745 int i; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
746 for (i = 0; i < priv->video_buffer_size_current; i++) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
747 free(priv->video_ringbuffer[i]); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
748 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
749 free(priv->video_ringbuffer); |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
750 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
751 |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32352
diff
changeset
|
752 free(priv->video_timebuffer); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32352
diff
changeset
|
753 free(priv->video_avg_buffer); |
23885 | 754 if (!priv->tv_param->noaudio) { |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32352
diff
changeset
|
755 free(priv->audio_ringbuffer); |
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32352
diff
changeset
|
756 free(priv->audio_skew_buffer); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
757 } |
2931 | 758 |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
759 return 1; |
2790 | 760 } |
761 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
762 static int get_capture_buffer_size(priv_t *priv) |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
763 { |
33644
c15dabfa2380
Do a proper calculation of free RAM to be used as V4L buffers.
iive
parents:
32511
diff
changeset
|
764 uint64_t bufsize; |
c15dabfa2380
Do a proper calculation of free RAM to be used as V4L buffers.
iive
parents:
32511
diff
changeset
|
765 int cnt; |
7905
b062996d9794
added an option for specifying the size of capture buffer
henry
parents:
7844
diff
changeset
|
766 |
23885 | 767 if (priv->tv_param->buffer_size >= 0) { |
768 bufsize = priv->tv_param->buffer_size*1024*1024; | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
769 } else { |
7905
b062996d9794
added an option for specifying the size of capture buffer
henry
parents:
7844
diff
changeset
|
770 #ifdef HAVE_SYS_SYSINFO_H |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
771 struct sysinfo si; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
772 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
773 sysinfo(&si); |
33644
c15dabfa2380
Do a proper calculation of free RAM to be used as V4L buffers.
iive
parents:
32511
diff
changeset
|
774 bufsize = (si.freeram/2)*si.mem_unit; |
c15dabfa2380
Do a proper calculation of free RAM to be used as V4L buffers.
iive
parents:
32511
diff
changeset
|
775 if (bufsize < 16*1024*1024) |
c15dabfa2380
Do a proper calculation of free RAM to be used as V4L buffers.
iive
parents:
32511
diff
changeset
|
776 #endif |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
777 bufsize = 16*1024*1024; |
7905
b062996d9794
added an option for specifying the size of capture buffer
henry
parents:
7844
diff
changeset
|
778 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
779 |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
780 cnt = bufsize/(priv->height*priv->bytesperline); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
781 if (cnt < 2) cnt = 2; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
782 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
783 return cnt; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
784 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
785 |
23926 | 786 static int vbi_init(priv_t* priv,char* device) |
787 { | |
788 int vbi_fd=0; | |
789 struct video_capability cap; | |
790 | |
791 if(!device) | |
792 return TVI_CONTROL_FALSE; | |
793 | |
794 priv->vbi_dev=strdup(device); | |
795 | |
796 vbi_fd=open(priv->vbi_dev,O_RDWR); | |
797 if(vbi_fd<0){ | |
798 mp_msg(MSGT_TV,MSGL_ERR,"vbi: could not open device %s\n",priv->vbi_dev); | |
799 return TVI_CONTROL_FALSE; | |
800 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27390
diff
changeset
|
801 |
23926 | 802 if(ioctl(vbi_fd,VIDIOCGCAP,&cap)<0){ |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31322
diff
changeset
|
803 mp_msg(MSGT_TV,MSGL_ERR,"vbi: Query capabilities failed for %s\n",priv->vbi_dev); |
23926 | 804 close(vbi_fd); |
805 return TVI_CONTROL_FALSE; | |
806 } | |
807 if(!cap.type & VID_TYPE_CAPTURE){ | |
808 mp_msg(MSGT_TV,MSGL_ERR,"vbi: %s is not capture device\n",priv->vbi_dev); | |
809 close(vbi_fd); | |
810 return TVI_CONTROL_FALSE; | |
811 } | |
812 | |
813 priv->vbi_fd=vbi_fd; | |
814 mp_msg(MSGT_TV,MSGL_DBG3,"vbi: init ok\n"); | |
815 return TVI_CONTROL_TRUE; | |
816 } | |
817 | |
818 static int vbi_get_props(priv_t* priv,tt_stream_props* ptsp) | |
819 { | |
820 struct vbi_format fmt; | |
821 int res; | |
822 if(!priv || !ptsp) | |
823 return TVI_CONTROL_FALSE; | |
824 | |
825 memset(&fmt,0,sizeof(struct vbi_format)); | |
826 if((res=ioctl(priv->vbi_fd,VIDIOCGVBIFMT,&fmt))<0){ | |
827 mp_msg(MSGT_TV,MSGL_ERR,"vbi_get_props: Query format failed: %x\n",res); | |
828 return TVI_CONTROL_FALSE; | |
829 } | |
830 | |
831 ptsp->interlaced=(fmt.flags& VBI_INTERLACED?1:0); | |
832 if(fmt.start[1]>0 && fmt.count[1]){ | |
833 if(fmt.start[1]>=286) | |
834 //625 | |
835 ptsp->offset=10.2e-6*fmt.sampling_rate; | |
836 else | |
837 //525 | |
838 ptsp->offset=9.2e-6*fmt.sampling_rate; | |
839 }else | |
840 ptsp->offset=9.7e-6*fmt.sampling_rate; | |
841 | |
842 ptsp->sampling_rate=fmt.sampling_rate; | |
843 ptsp->samples_per_line=fmt.samples_per_line, | |
844 | |
845 ptsp->count[0]=fmt.count[0]; | |
846 ptsp->count[1]=fmt.count[1]; | |
847 ptsp->bufsize = ptsp->samples_per_line * (ptsp->count[0] + ptsp->count[1]); | |
848 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27390
diff
changeset
|
849 mp_msg(MSGT_TV,MSGL_V,"vbi_get_props: sampling_rate=%d,offset:%d,samples_per_line: %d\n interlaced:%s, count=[%d,%d]\n", |
23926 | 850 ptsp->sampling_rate, |
851 ptsp->offset, | |
852 ptsp->samples_per_line, | |
853 ptsp->interlaced?"Yes":"No", | |
854 ptsp->count[0], | |
855 ptsp->count[1]); | |
856 | |
857 return TVI_CONTROL_TRUE; | |
858 } | |
859 | |
860 static void *vbi_grabber(void *data) | |
861 { | |
862 priv_t *priv = (priv_t *) data; | |
863 int bytes,seq,prev_seq; | |
864 unsigned char* buf; | |
865 tt_stream_props tsp; | |
866 | |
867 if(!priv->priv_vbi){ | |
868 mp_msg(MSGT_TV,MSGL_WARN,"vbi: vbi not initialized. stopping thread.\n"); | |
869 return NULL; | |
870 } | |
871 | |
872 if(vbi_get_props(priv,&tsp)!=TVI_CONTROL_TRUE) | |
873 return NULL; | |
874 | |
875 buf=malloc(tsp.bufsize); | |
876 seq=0; | |
877 prev_seq=0; | |
878 mp_msg(MSGT_TV,MSGL_V,"vbi: vbi capture thread started.\n"); | |
879 | |
880 while (!priv->vbi_shutdown){ | |
881 bytes=read(priv->vbi_fd,buf,tsp.bufsize); | |
24763
5d7f6e5e0847
After receiving EINTR 'read' syscall should be restarted.
voroshil
parents:
24759
diff
changeset
|
882 if(bytes<0 && errno==EINTR) |
5d7f6e5e0847
After receiving EINTR 'read' syscall should be restarted.
voroshil
parents:
24759
diff
changeset
|
883 continue; |
23926 | 884 if (bytes!=tsp.bufsize){ |
885 mp_msg(MSGT_TV,MSGL_WARN,"vbi: expecting bytes: %d, got: %d",tsp.bufsize,bytes); | |
886 break; | |
887 } | |
888 seq=*(int*)(buf+bytes-4); | |
889 if(seq<=1) continue; | |
890 if (prev_seq && seq!=prev_seq+1){ | |
891 prev_seq=0; | |
892 seq=0; | |
893 } | |
894 prev_seq=seq; | |
895 teletext_control(priv->priv_vbi,TV_VBI_CONTROL_DECODE_PAGE,&buf); | |
896 mp_msg(MSGT_TV,MSGL_DBG3,"grabber: seq:%d\n",seq); | |
897 } | |
898 free(buf); | |
899 return NULL; | |
900 } | |
901 | |
2802 | 902 static int start(priv_t *priv) |
2790 | 903 { |
2802 | 904 int i; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
905 int bytes_per_sample; |
23354 | 906 struct video_window win; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
907 |
3815 | 908 if (ioctl(priv->video_fd, VIDIOCGPICT, &priv->picture) == -1) |
2790 | 909 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
910 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
911 return 0; |
2790 | 912 } |
913 | |
2802 | 914 priv->picture.palette = format2palette(priv->format); |
915 priv->picture.depth = palette2depth(priv->picture.palette); | |
3815 | 916 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
917 if (priv->format != IMGFMT_BGR15) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
918 priv->bytesperline = priv->width * priv->picture.depth / 8; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
919 } else { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
920 priv->bytesperline = priv->width * 2; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
921 } |
3815 | 922 |
7318
85897ab199a4
changed message leveles (too many non-sense info messages)
alex
parents:
7317
diff
changeset
|
923 mp_msg(MSGT_TV, MSGL_V, "Picture values:\n"); |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
924 mp_msg(MSGT_TV, MSGL_V, " Depth: %d, Palette: %s (Format: %s)\n", priv->picture.depth, |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
925 PALETTE(priv->picture.palette), vo_format_name(priv->format)); |
7318
85897ab199a4
changed message leveles (too many non-sense info messages)
alex
parents:
7317
diff
changeset
|
926 mp_msg(MSGT_TV, MSGL_V, " Brightness: %d, Hue: %d, Colour: %d, Contrast: %d\n", |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
927 priv->picture.brightness, priv->picture.hue, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
928 priv->picture.colour, priv->picture.contrast); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
929 |
3815 | 930 if (ioctl(priv->video_fd, VIDIOCSPICT, &priv->picture) == -1) |
2790 | 931 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
932 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set picture failed: %s\n", strerror(errno)); |
23354 | 933 mp_msg(MSGT_TV, MSGL_ERR, "The 'outfmt' of '%s' is likely not supported by your card\n", |
934 vo_format_name(priv->format)); | |
935 return 0; | |
936 } | |
937 | |
938 /* Set capture size */ | |
939 win.x = 0; | |
940 win.y = 0; | |
941 win.width = priv->width; | |
942 win.height = priv->height; | |
943 win.chromakey = -1; | |
944 win.flags = 0; | |
945 win.clipcount = 0; | |
946 if (ioctl(priv->video_fd, VIDIOCSWIN, &win) == -1) | |
947 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set window failed: %s\n", strerror(errno)); | |
948 | |
23885 | 949 if ( !priv->tv_param->mjpeg ) |
23354 | 950 { |
951 /* map grab buffer */ | |
952 if (ioctl(priv->video_fd, VIDIOCGMBUF, &priv->mbuf) == -1) | |
953 { | |
954 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get mbuf failed: %s\n", strerror(errno)); | |
955 return 0; | |
956 } | |
957 | |
958 mp_msg(MSGT_TV, MSGL_V, "mbuf: size=%d, frames=%d\n", | |
959 priv->mbuf.size, priv->mbuf.frames); | |
960 priv->mmap = mmap(0, priv->mbuf.size, PROT_READ|PROT_WRITE, | |
961 MAP_SHARED, priv->video_fd, 0); | |
962 if (priv->mmap == (unsigned char *)-1) | |
963 { | |
964 mp_msg(MSGT_TV, MSGL_ERR, "Unable to map memory for buffers: %s\n", strerror(errno)); | |
965 return 0; | |
966 } | |
967 mp_msg(MSGT_TV, MSGL_DBG2, "our buffer: %p\n", priv->mmap); | |
968 | |
969 /* num of buffers */ | |
970 priv->nbuf = priv->mbuf.frames; | |
971 | |
972 /* video buffers */ | |
973 priv->buf = calloc(priv->nbuf, sizeof(struct video_mmap)); | |
974 if (!priv->buf) | |
975 return 0; | |
976 memset(priv->buf, 0, priv->nbuf * sizeof(struct video_mmap)); | |
2790 | 977 } |
978 | |
23885 | 979 if ( !priv->tv_param->mjpeg ) |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
980 { |
23149 | 981 priv->nbuf = priv->mbuf.frames; |
982 for (i=0; i < priv->nbuf; i++) | |
983 { | |
984 priv->buf[i].format = priv->picture.palette; | |
985 priv->buf[i].frame = i; | |
986 priv->buf[i].width = priv->width; | |
987 priv->buf[i].height = priv->height; | |
988 mp_msg(MSGT_TV, MSGL_DBG2, "buffer: %d => %p\n", i, &priv->buf[i]); | |
989 } | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
990 } |
2837 | 991 |
2931 | 992 #if 0 |
993 { | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
994 struct video_play_mode pmode; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
995 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
996 pmode.mode = VID_PLAY_NORMAL; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
997 pmode.p1 = 1; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
998 pmode.p2 = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
999 if (ioctl(priv->video_fd, VIDIOCSPLAYMODE, &pmode) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1000 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1001 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set play mode failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1002 // return 0; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1003 } |
2931 | 1004 } |
1005 #endif | |
2837 | 1006 |
1007 #if 0 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1008 // initialize video capture |
3815 | 1009 if (ioctl(priv->video_fd, VIDIOCCAPTURE, &one) == -1) |
2802 | 1010 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1011 mp_msg(MSGT_TV, MSGL_ERR, "FATAL: ioctl ccapture failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1012 return 0; |
2802 | 1013 } |
2837 | 1014 #endif |
1015 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1016 /* setup audio parameters */ |
23885 | 1017 if (!priv->tv_param->noaudio) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1018 setup_audio_buffer_sizes(priv); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1019 bytes_per_sample = priv->audio_in.bytes_per_sample; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1020 priv->audio_skew_buffer = calloc(priv->aud_skew_cnt, sizeof(long long)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1021 if (!priv->audio_skew_buffer) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1022 mp_msg(MSGT_TV, MSGL_ERR, "cannot allocate skew buffer: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1023 return 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1024 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1025 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1026 priv->audio_ringbuffer = calloc(priv->audio_in.blocksize, priv->audio_buffer_size); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1027 if (!priv->audio_ringbuffer) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1028 mp_msg(MSGT_TV, MSGL_ERR, "cannot allocate audio buffer: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1029 return 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1030 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1031 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1032 priv->audio_secs_per_block = (double)priv->audio_in.blocksize/(priv->audio_in.samplerate |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1033 *priv->audio_in.channels |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1034 *bytes_per_sample); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1035 priv->audio_head = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1036 priv->audio_tail = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1037 priv->audio_cnt = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1038 priv->audio_drop = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1039 priv->audio_skew = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1040 priv->audio_skew_total = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1041 priv->audio_recv_blocks_total = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1042 priv->audio_sent_blocks_total = 0; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1043 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1044 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1045 /* setup video parameters */ |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1046 if (priv->immediate_mode) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1047 priv->video_buffer_size_max = VID_BUF_SIZE_IMMEDIATE; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1048 } else { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1049 priv->video_buffer_size_max = get_capture_buffer_size(priv); |
6553
d000112bd06e
Paul Ortyl's patch - tv4l timestamps (not so precise :()
alex
parents:
6529
diff
changeset
|
1050 } |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
1051 priv->video_buffer_size_current = 0; |
6553
d000112bd06e
Paul Ortyl's patch - tv4l timestamps (not so precise :()
alex
parents:
6529
diff
changeset
|
1052 |
23885 | 1053 if (!priv->tv_param->noaudio) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1054 if (priv->video_buffer_size_max < 3.0*priv->fps*priv->audio_secs_per_block) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1055 mp_msg(MSGT_TV, MSGL_ERR, "Video buffer shorter than 3 times audio frame duration.\n" |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1056 "You will probably experience heavy framedrops.\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1057 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1058 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1059 |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
1060 mp_msg(MSGT_TV, MSGL_V, "Using a ring buffer for maximum %d frames, %d MB total size.\n", |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1061 priv->video_buffer_size_max, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1062 priv->video_buffer_size_max*priv->height*priv->bytesperline/(1024*1024)); |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
1063 |
18885 | 1064 priv->video_ringbuffer = calloc(priv->video_buffer_size_max, sizeof(unsigned char*)); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1065 if (!priv->video_ringbuffer) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1066 mp_msg(MSGT_TV, MSGL_ERR, "cannot allocate video buffer: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1067 return 0; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1068 } |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
1069 for (i = 0; i < priv->video_buffer_size_max; i++) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1070 priv->video_ringbuffer[i] = NULL; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1071 |
18885 | 1072 priv->video_timebuffer = calloc(priv->video_buffer_size_max, sizeof(long long)); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1073 if (!priv->video_timebuffer) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1074 mp_msg(MSGT_TV, MSGL_ERR, "cannot allocate time buffer: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1075 return 0; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1076 } |
18885 | 1077 priv->video_avg_buffer = malloc(sizeof(long long) * VIDEO_AVG_BUFFER_SIZE); |
9607
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1078 if (!priv->video_avg_buffer) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1079 mp_msg(MSGT_TV, MSGL_ERR, "cannot allocate period buffer: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1080 return 0; |
9607
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1081 } |
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1082 priv->video_interval_sum = (1e6/priv->fps)*VIDEO_AVG_BUFFER_SIZE; |
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1083 for (i = 0; i < VIDEO_AVG_BUFFER_SIZE; i++) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1084 priv->video_avg_buffer[i] = 1e6/priv->fps; |
9607
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1085 } |
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1086 |
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1087 priv->video_avg_ptr = 0; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1088 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1089 priv->video_head = 0; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1090 priv->video_tail = 0; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1091 priv->video_cnt = 0; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1092 priv->first = 1; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1093 |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
1094 if (priv->capability.audios) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1095 /* enable audio */ |
23885 | 1096 if (priv->tv_param->volume >= 0) |
1097 priv->audio[priv->audio_id].volume = priv->tv_param->volume; | |
1098 if (priv->tv_param->bass >= 0) | |
1099 priv->audio[priv->audio_id].bass = priv->tv_param->bass; | |
1100 if (priv->tv_param->treble >= 0) | |
1101 priv->audio[priv->audio_id].treble = priv->tv_param->treble; | |
1102 if (priv->tv_param->balance >= 0) | |
1103 priv->audio[priv->audio_id].balance = priv->tv_param->balance; | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1104 priv->audio[priv->audio_id].flags &= ~VIDEO_AUDIO_MUTE; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1105 mp_msg(MSGT_TV, MSGL_V, "Enabling tv audio. Requested setup is:\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1106 mp_msg(MSGT_TV, MSGL_V, "id=%d vol=%d bass=%d treble=%d balance=%d mode=%s", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1107 priv->audio_id, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1108 priv->audio[priv->audio_id].volume, priv->audio[priv->audio_id].bass, priv->audio[priv->audio_id].treble, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1109 priv->audio[priv->audio_id].balance, audio_mode2name(priv->audio[priv->audio_id].mode)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1110 mp_msg(MSGT_TV, MSGL_V, " chan=%d\n", priv->audio_channels[priv->audio_id]); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1111 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]); |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
1112 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1113 |
23926 | 1114 /* start vbi thread */ |
1115 if(priv->priv_vbi){ | |
1116 priv->vbi_shutdown = 0; | |
1117 pthread_create(&priv->vbi_grabber_thread, NULL, vbi_grabber, priv); | |
1118 } | |
1119 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1120 /* launch capture threads */ |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1121 priv->shutdown = 0; |
23885 | 1122 if (!priv->tv_param->noaudio) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1123 pthread_mutex_init(&priv->audio_starter, NULL); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1124 pthread_mutex_init(&priv->skew_mutex, NULL); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1125 pthread_mutex_lock(&priv->audio_starter); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1126 pthread_create(&priv->audio_grabber_thread, NULL, audio_grabber, priv); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1127 } |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
1128 pthread_mutex_init(&priv->video_buffer_mutex, NULL); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1129 /* we'll launch the video capture later, when a first request for a frame arrives */ |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1130 |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1131 return 1; |
2790 | 1132 } |
1133 | |
9663 | 1134 |
2790 | 1135 static int control(priv_t *priv, int cmd, void *arg) |
1136 { | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1137 mp_msg(MSGT_TV, MSGL_DBG2, "\ndebug: control(priv=%p, cmd=%d, arg=%p)\n", |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1138 priv, cmd, arg); |
2790 | 1139 switch(cmd) |
1140 { | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1141 /* ========== GENERIC controls =========== */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1142 case TVI_CONTROL_IS_VIDEO: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1143 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1144 if (priv->capability.type & VID_TYPE_CAPTURE) |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1145 return TVI_CONTROL_TRUE; |
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1146 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1147 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1148 case TVI_CONTROL_IS_AUDIO: |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1149 if (priv->tv_param->force_audio) return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1150 if (priv->channels[priv->act_channel].flags & VIDEO_VC_AUDIO) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1151 { |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1152 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1153 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1154 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1155 case TVI_CONTROL_IS_TUNER: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1156 { |
23149 | 1157 // if (priv->capability.type & VID_TYPE_TUNER) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1158 if (priv->channels[priv->act_channel].flags & VIDEO_VC_TUNER) |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1159 return TVI_CONTROL_TRUE; |
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1160 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1161 } |
2802 | 1162 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1163 /* ========== VIDEO controls =========== */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1164 case TVI_CONTROL_VID_GET_FORMAT: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1165 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1166 int output_fmt = -1; |
2802 | 1167 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1168 output_fmt = priv->format; |
23885 | 1169 if ( priv->tv_param->mjpeg ) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1170 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1171 mp_msg(MSGT_TV, MSGL_INFO, " MJP: setting sh_video->format to mjpg\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1172 output_fmt = 0x47504a4d; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1173 output_fmt = 0x67706a6d; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1174 *(int *)arg = output_fmt; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1175 mp_msg(MSGT_TV, MSGL_V, "Output format: %s\n", "mjpg"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1176 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1177 else |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1178 { |
23149 | 1179 *(int *)arg = output_fmt; |
1180 mp_msg(MSGT_TV, MSGL_V, "Output format: %s\n", vo_format_name(output_fmt)); | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1181 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1182 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1183 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1184 case TVI_CONTROL_VID_SET_FORMAT: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1185 priv->format = *(int *)arg; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1186 // !HACK! v4l uses BGR format instead of RGB |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1187 // and we have to correct this. Fortunately, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1188 // tv.c reads later the format back so we |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1189 // can persuade it to use what we want. |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1190 if (IMGFMT_IS_RGB(priv->format)) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1191 priv->format &= ~IMGFMT_RGB_MASK; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1192 priv->format |= IMGFMT_BGR; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1193 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1194 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1195 case TVI_CONTROL_VID_GET_PLANES: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1196 *(int *)arg = 1; /* FIXME, also not needed at this time */ |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1197 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1198 case TVI_CONTROL_VID_GET_BITS: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1199 *(int *)arg = palette2depth(format2palette(priv->format)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1200 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1201 case TVI_CONTROL_VID_GET_WIDTH: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1202 *(int *)arg = priv->width; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1203 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1204 case TVI_CONTROL_VID_CHK_WIDTH: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1205 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1206 int req_width = *(int *)arg; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1207 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1208 mp_msg(MSGT_TV, MSGL_V, "Requested width: %d\n", req_width); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1209 if ((req_width >= priv->capability.minwidth) && |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1210 (req_width <= priv->capability.maxwidth)) |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1211 return TVI_CONTROL_TRUE; |
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1212 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1213 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1214 case TVI_CONTROL_VID_SET_WIDTH: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1215 priv->width = *(int *)arg; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1216 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1217 case TVI_CONTROL_VID_GET_HEIGHT: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1218 *(int *)arg = priv->height; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1219 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1220 case TVI_CONTROL_VID_CHK_HEIGHT: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1221 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1222 int req_height = *(int *)arg; |
2790 | 1223 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1224 mp_msg(MSGT_TV, MSGL_V, "Requested height: %d\n", req_height); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1225 if ((req_height >= priv->capability.minheight) && |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1226 (req_height <= priv->capability.maxheight)) |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1227 return TVI_CONTROL_TRUE; |
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1228 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1229 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1230 case TVI_CONTROL_VID_SET_HEIGHT: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1231 priv->height = *(int *)arg; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1232 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1233 case TVI_CONTROL_VID_GET_PICTURE: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1234 if (ioctl(priv->video_fd, VIDIOCGPICT, &priv->picture) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1235 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1236 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1237 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1238 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1239 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1240 case TVI_CONTROL_VID_SET_PICTURE: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1241 if (ioctl(priv->video_fd, VIDIOCSPICT, &priv->picture) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1242 { |
23150 | 1243 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set picture failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1244 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1245 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1246 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1247 case TVI_CONTROL_VID_SET_BRIGHTNESS: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1248 priv->picture.brightness = (327*(*(int *)arg+100)) + 68; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1249 return control(priv, TVI_CONTROL_VID_SET_PICTURE, 0); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1250 case TVI_CONTROL_VID_SET_HUE: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1251 priv->picture.hue = (327*(*(int *)arg+100)) + 68; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1252 return control(priv, TVI_CONTROL_VID_SET_PICTURE, 0); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1253 case TVI_CONTROL_VID_SET_SATURATION: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1254 priv->picture.colour = (327*(*(int *)arg+100)) + 68; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1255 return control(priv, TVI_CONTROL_VID_SET_PICTURE, 0); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1256 case TVI_CONTROL_VID_SET_CONTRAST: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1257 priv->picture.contrast = (327*(*(int *)arg+100)) + 68; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1258 return control(priv, TVI_CONTROL_VID_SET_PICTURE, 0); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1259 case TVI_CONTROL_VID_GET_BRIGHTNESS: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1260 if(!control(priv, TVI_CONTROL_VID_GET_PICTURE, 0)) return 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1261 *(int*)arg = ((int)priv->picture.brightness-68)/327-100; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1262 return 1; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1263 case TVI_CONTROL_VID_GET_HUE: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1264 if(!control(priv, TVI_CONTROL_VID_GET_PICTURE, 0)) return 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1265 *(int*)arg = ((int)priv->picture.hue-68)/327-100; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1266 return 1; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1267 case TVI_CONTROL_VID_GET_SATURATION: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1268 if(!control(priv, TVI_CONTROL_VID_GET_PICTURE, 0)) return 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1269 *(int*)arg = ((int)priv->picture.colour-68)/327-100; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1270 return 1; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1271 case TVI_CONTROL_VID_GET_CONTRAST: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1272 if(!control(priv, TVI_CONTROL_VID_GET_PICTURE, 0)) return 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1273 *(int*)arg = ((int)priv->picture.contrast-68)/327-100; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1274 return 1; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1275 case TVI_CONTROL_VID_GET_FPS: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1276 *(float *)arg=priv->fps; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1277 return TVI_CONTROL_TRUE; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1278 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1279 /* ========== TUNER controls =========== */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1280 case TVI_CONTROL_TUN_GET_FREQ: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1281 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1282 unsigned long freq; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1283 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1284 if (ioctl(priv->video_fd, VIDIOCGFREQ, &freq) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1285 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1286 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get freq failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1287 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1288 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1289 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1290 /* tuner uses khz not mhz ! */ |
23149 | 1291 // if (priv->tuner.flags & VIDEO_TUNER_LOW) |
1292 // freq /= 1000; | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1293 *(unsigned long *)arg = freq; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1294 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1295 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1296 case TVI_CONTROL_TUN_SET_FREQ: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1297 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1298 /* argument is in MHz ! */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1299 unsigned long freq = *(unsigned long *)arg; |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
1300 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1301 if (priv->capability.audios) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1302 priv->audio[priv->audio_id].flags |= VIDEO_AUDIO_MUTE; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1303 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1304 } |
8485
4e32317f08be
don't give up when set_tuner fails; more zero div sanity checks
henry
parents:
8477
diff
changeset
|
1305 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1306 mp_msg(MSGT_TV, MSGL_V, "requested frequency: %.3f\n", (float)freq/16); |
7532
26cd91676fb6
complex patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7472
diff
changeset
|
1307 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1308 /* tuner uses khz not mhz ! */ |
23149 | 1309 // if (priv->tuner.flags & VIDEO_TUNER_LOW) |
1310 // freq *= 1000; | |
1311 // mp_msg(MSGT_TV, MSGL_V, " requesting from driver: freq=%.3f\n", (float)freq/16); | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1312 if (ioctl(priv->video_fd, VIDIOCSFREQ, &freq) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1313 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1314 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set freq failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1315 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1316 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1317 usleep(100000); // wait to suppress noise during switching |
2802 | 1318 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1319 if (priv->capability.audios) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1320 priv->audio[priv->audio_id].flags &= ~VIDEO_AUDIO_MUTE; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1321 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1322 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1323 |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1324 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1325 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1326 case TVI_CONTROL_TUN_GET_TUNER: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1327 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1328 if (ioctl(priv->video_fd, VIDIOCGTUNER, &priv->tuner) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1329 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1330 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get tuner failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1331 return TVI_CONTROL_FALSE; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1332 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1333 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1334 mp_msg(MSGT_TV, MSGL_V, "Tuner (%s) range: %lu -> %lu\n", priv->tuner.name, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1335 priv->tuner.rangelow, priv->tuner.rangehigh); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1336 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1337 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1338 case TVI_CONTROL_TUN_SET_TUNER: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1339 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1340 if (ioctl(priv->video_fd, VIDIOCSTUNER, &priv->tuner) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1341 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1342 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set tuner failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1343 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1344 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1345 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1346 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1347 case TVI_CONTROL_TUN_SET_NORM: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1348 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1349 int req_mode = *(int *)arg; |
24789
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1350 int norm_index; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1351 for(norm_index=0;supported_norms[norm_index].name; norm_index++) |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1352 if(req_mode==supported_norms[norm_index].normid) |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1353 break; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1354 |
24789
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1355 if(!supported_norms[norm_index].name) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1356 mp_msg(MSGT_TV, MSGL_ERR, "Unknown norm!\n"); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1357 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1358 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1359 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1360 if (priv->channels[priv->act_channel].flags & VIDEO_VC_TUNER) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1361 int prev_mode; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1362 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1363 control(priv, TVI_CONTROL_TUN_GET_TUNER, 0); |
24789
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1364 if(!(priv->tuner.flags & supported_norms[norm_index].tuner_flags)) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1365 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1366 mp_msg(MSGT_TV, MSGL_ERR, "Tuner isn't capable to set norm!\n"); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1367 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1368 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1369 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1370 prev_mode = priv->tuner.mode; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1371 |
24789
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1372 priv->tuner.mode = supported_norms[norm_index].tuner_mode; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1373 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1374 if (control(priv, TVI_CONTROL_TUN_SET_TUNER, &priv->tuner) != TVI_CONTROL_TRUE) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1375 // norm setting failed, but maybe it's only because it's fixed |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1376 if (priv->tuner.mode != prev_mode) return TVI_CONTROL_FALSE; // no it really failed |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1377 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1378 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1379 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1380 |
24789
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1381 priv->channels[priv->act_channel].norm = supported_norms[norm_index].input_norm; |
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1382 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1383 if (ioctl(priv->video_fd, VIDIOCSCHAN, &priv->channels[priv->act_channel]) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1384 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1385 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set chan failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1386 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1387 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1388 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1389 if (ioctl(priv->video_fd, VIDIOCGCAP, &priv->capability) == -1) { |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31322
diff
changeset
|
1390 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get capabilities failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1391 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1392 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1393 |
24789
f6b881513502
Simplify handling SET_NORM for V4l1: replace several if-else-if and switch
voroshil
parents:
24763
diff
changeset
|
1394 priv->fps = supported_norms[norm_index].fps; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1395 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1396 if(priv->height > priv->capability.maxheight) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1397 priv->height = priv->capability.maxheight; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1398 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1399 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1400 if(priv->width > priv->capability.maxwidth) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1401 priv->width = priv->capability.maxwidth; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1402 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1403 |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1404 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1405 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1406 case TVI_CONTROL_TUN_GET_NORM: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1407 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1408 *(int *)arg = priv->tuner.mode; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1409 |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1410 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1411 } |
24105
9e71e0345c35
Automatic TV channels scanning ability for MPlayer.
voroshil
parents:
23926
diff
changeset
|
1412 case TVI_CONTROL_TUN_GET_SIGNAL: |
9e71e0345c35
Automatic TV channels scanning ability for MPlayer.
voroshil
parents:
23926
diff
changeset
|
1413 { |
9e71e0345c35
Automatic TV channels scanning ability for MPlayer.
voroshil
parents:
23926
diff
changeset
|
1414 if (ioctl(priv->video_fd, VIDIOCGTUNER, &priv->tuner) == -1) |
9e71e0345c35
Automatic TV channels scanning ability for MPlayer.
voroshil
parents:
23926
diff
changeset
|
1415 { |
9e71e0345c35
Automatic TV channels scanning ability for MPlayer.
voroshil
parents:
23926
diff
changeset
|
1416 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get tuner failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1417 return TVI_CONTROL_FALSE; |
24105
9e71e0345c35
Automatic TV channels scanning ability for MPlayer.
voroshil
parents:
23926
diff
changeset
|
1418 } |
9e71e0345c35
Automatic TV channels scanning ability for MPlayer.
voroshil
parents:
23926
diff
changeset
|
1419 *(int*)arg=100*(priv->tuner.signal>>8)/255; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1420 return TVI_CONTROL_TRUE; |
24105
9e71e0345c35
Automatic TV channels scanning ability for MPlayer.
voroshil
parents:
23926
diff
changeset
|
1421 } |
2802 | 1422 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1423 /* ========== AUDIO controls =========== */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1424 case TVI_CONTROL_AUD_GET_FORMAT: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1425 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1426 *(int *)arg = AF_FORMAT_S16_LE; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1427 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1428 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1429 case TVI_CONTROL_AUD_GET_CHANNELS: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1430 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1431 *(int *)arg = priv->audio_in.channels; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1432 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1433 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1434 case TVI_CONTROL_AUD_GET_SAMPLERATE: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1435 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1436 *(int *)arg = priv->audio_in.samplerate; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1437 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1438 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1439 case TVI_CONTROL_AUD_GET_SAMPLESIZE: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1440 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1441 *(int *)arg = priv->audio_in.bytes_per_sample; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1442 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1443 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1444 case TVI_CONTROL_AUD_SET_SAMPLERATE: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1445 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1446 if (audio_in_set_samplerate(&priv->audio_in, *(int *)arg) < 0) return TVI_CONTROL_FALSE; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1447 setup_audio_buffer_sizes(priv); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1448 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1449 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1450 /* ========== SPECIFIC controls =========== */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1451 case TVI_CONTROL_SPC_GET_INPUT: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1452 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1453 int req_chan = *(int *)arg; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1454 int i; |
2802 | 1455 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1456 for (i = 0; i < priv->capability.channels; i++) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1457 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1458 if (priv->channels[i].channel == req_chan) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1459 break; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1460 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1461 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1462 priv->act_channel = i; |
2802 | 1463 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1464 if (ioctl(priv->video_fd, VIDIOCGCHAN, &priv->channels[i]) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1465 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1466 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get channel failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1467 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1468 } |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1469 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1470 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1471 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1472 case TVI_CONTROL_SPC_SET_INPUT: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1473 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1474 struct video_channel chan; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1475 int req_chan = *(int *)arg; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1476 int i; |
2802 | 1477 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1478 if (req_chan >= priv->capability.channels) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1479 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1480 mp_msg(MSGT_TV, MSGL_ERR, "Invalid input requested: %d, valid: 0-%d\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1481 req_chan, priv->capability.channels - 1); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1482 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1483 } |
2802 | 1484 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1485 for (i = 0; i < priv->capability.channels; i++) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1486 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1487 if (priv->channels[i].channel == req_chan) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1488 chan = priv->channels[i]; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1489 } |
2802 | 1490 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1491 if (ioctl(priv->video_fd, VIDIOCSCHAN, &chan) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1492 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1493 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set chan failed: %s\n", strerror(errno)); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1494 return TVI_CONTROL_FALSE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1495 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1496 mp_msg(MSGT_TV, MSGL_INFO, "Using input '%s'\n", chan.name); |
2802 | 1497 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1498 priv->act_channel = i; |
2841 | 1499 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1500 /* update tuner state */ |
23149 | 1501 // if (priv->capability.type & VID_TYPE_TUNER) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1502 if (priv->channels[priv->act_channel].flags & VIDEO_VC_TUNER) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1503 control(priv, TVI_CONTROL_TUN_GET_TUNER, 0); |
2802 | 1504 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1505 /* update local channel list */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1506 control(priv, TVI_CONTROL_SPC_GET_INPUT, &req_chan); |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1507 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1508 case TVI_CONTROL_IMMEDIATE: |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1509 priv->immediate_mode = 1; |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1510 return TVI_CONTROL_TRUE; |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1511 } |
23926 | 1512 case TVI_CONTROL_VBI_INIT: |
1513 { | |
1514 void* ptr; | |
1515 tt_stream_props tsp; | |
1516 | |
1517 if (vbi_init(priv,*(char**)arg)!=TVI_CONTROL_TRUE) | |
1518 return TVI_CONTROL_FALSE; | |
1519 if(vbi_get_props(priv,&tsp)==TVI_CONTROL_TRUE) | |
1520 { | |
1521 ptr=&tsp; | |
29760
1cc8a20520e8
Add MSGT_TELETEXT, rename TVI_CONTROL as VBI_CONTROL and fix some paths
cehoyos
parents:
29759
diff
changeset
|
1522 if(teletext_control(NULL,TV_VBI_CONTROL_START,&ptr)==VBI_CONTROL_TRUE) |
23926 | 1523 priv->priv_vbi=ptr; |
1524 else | |
1525 priv->priv_vbi=NULL; | |
1526 } | |
1527 return TVI_CONTROL_TRUE; | |
1528 } | |
29806 | 1529 case TVI_CONTROL_GET_VBI_PTR: |
1530 *(void **)arg=priv->priv_vbi; | |
1531 return TVI_CONTROL_TRUE; | |
2790 | 1532 } |
1533 | |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1534 return TVI_CONTROL_UNKNOWN; |
2790 | 1535 } |
1536 | |
23422 | 1537 static int set_mute(priv_t* priv,int value) |
1538 { | |
1539 if (!priv->capability.audios) { | |
1540 return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27390
diff
changeset
|
1541 |
23422 | 1542 if(value) |
1543 priv->audio[priv->audio_id].flags |=VIDEO_AUDIO_MUTE; | |
1544 else | |
1545 priv->audio[priv->audio_id].flags &= ~VIDEO_AUDIO_MUTE; | |
1546 } | |
1547 if(ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id])<0) | |
1548 return 0; | |
1549 return 1; | |
1550 } | |
1551 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1552 // copies a video frame |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1553 // for YV12 swaps the 2nd and 3rd plane |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1554 static inline void copy_frame(priv_t *priv, unsigned char *dest, unsigned char *source) |
2790 | 1555 { |
23885 | 1556 if(priv->tv_param->automute>0){ |
23422 | 1557 if (ioctl(priv->video_fd, VIDIOCGTUNER, &priv->tuner) >= 0) { |
23885 | 1558 if(priv->tv_param->automute<<8>priv->tuner.signal){ |
23422 | 1559 fill_blank_frame(dest,priv->bytesperline * priv->height,priv->format); |
1560 set_mute(priv,1); | |
1561 return; | |
1562 } | |
1563 } | |
1564 set_mute(priv,0); | |
1565 } | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1566 // YV12 uses VIDEO_PALETTE_YUV420P, but the planes are swapped |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1567 if (priv->format == IMGFMT_YV12) { |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23422
diff
changeset
|
1568 fast_memcpy(dest, source, priv->width * priv->height); |
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23422
diff
changeset
|
1569 fast_memcpy(dest+priv->width * priv->height*5/4, source+priv->width * priv->height, priv->width * priv->height/4); |
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23422
diff
changeset
|
1570 fast_memcpy(dest+priv->width * priv->height, source+priv->width * priv->height*5/4, priv->width * priv->height/4); |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1571 return; |
2790 | 1572 } |
3711 | 1573 |
23724 | 1574 fast_memcpy(dest, source, priv->bytesperline * priv->height); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1575 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1576 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1577 // maximum skew change, in frames |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1578 #define MAX_SKEW_DELTA 0.6 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1579 static void *video_grabber(void *data) |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1580 { |
9608 | 1581 #define MAXTOL (priv->nbuf) |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1582 priv_t *priv = (priv_t*)data; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1583 struct timeval curtime; |
8131 | 1584 long long skew, prev_skew, xskew, interval, prev_interval; |
8650
cf1d4f48aecf
allow utilization of more v4l buffers, patch by Carsten Schulz <carsten@gnocchi.dialup.fu-berlin.de>
henry
parents:
8627
diff
changeset
|
1585 int frame; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1586 int i; |
7803
172ee2b4612f
Stop grabbing from v4l when paused by Jindrich Makovicka
alex
parents:
7585
diff
changeset
|
1587 int framecount; |
9607
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1588 int tolerance; |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
1589 unsigned long num; |
3711 | 1590 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1591 /* start the capture process */ |
8650
cf1d4f48aecf
allow utilization of more v4l buffers, patch by Carsten Schulz <carsten@gnocchi.dialup.fu-berlin.de>
henry
parents:
8627
diff
changeset
|
1592 |
23885 | 1593 if ( priv->tv_param->mjpeg ) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1594 { |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
1595 mp_msg(MSGT_TV, MSGL_INFO, " MJP: gonna capture ! \n"); |
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
1596 for (i=0; i < priv->nbuf; i++) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1597 num = i; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1598 if (ioctl(priv->video_fd, MJPIOC_QBUF_CAPT, &num) < 0) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1599 mp_msg(MSGT_TV, MSGL_ERR, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1600 "\n MJP: ioctl MJPIOC_QBUF_CAPT b failed: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1601 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1602 } |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
1603 else |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1604 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1605 for (i=0; i < priv->nbuf; i++) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1606 if (ioctl(priv->video_fd, VIDIOCMCAPTURE, &priv->buf[i]) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1607 mp_msg(MSGT_TV, MSGL_ERR, "\nioctl mcapture failed: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1608 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1609 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1610 |
9608 | 1611 gettimeofday(&curtime, NULL); |
1612 priv->starttime = (long long)1e6*curtime.tv_sec + curtime.tv_usec; | |
1613 priv->audio_skew_measure_time = 0; | |
1614 pthread_mutex_unlock(&priv->audio_starter); | |
1615 xskew = 0; | |
1616 skew = 0; | |
1617 interval = 0; | |
1618 | |
8131 | 1619 prev_interval = 0; |
1620 prev_skew = 0; | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1621 |
9608 | 1622 tolerance = MAXTOL; |
9607
e2eaeb3cb089
correct small framerate fluctuations directly in the capture thread
henry
parents:
9216
diff
changeset
|
1623 |
7803
172ee2b4612f
Stop grabbing from v4l when paused by Jindrich Makovicka
alex
parents:
7585
diff
changeset
|
1624 for (framecount = 0; !priv->shutdown;) |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1625 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1626 for (i = 0; i < priv->nbuf && !priv->shutdown; i++, framecount++) { |
7585
cfd6a99021ac
some cleanups for video_grabber() which fix a race condition by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents:
7532
diff
changeset
|
1627 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1628 if (priv->immediate_mode) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1629 while (priv->video_cnt == priv->video_buffer_size_max) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1630 usleep(10000); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1631 if (priv->shutdown) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1632 return NULL; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1633 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1634 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1635 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1636 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1637 frame = i; |
2931 | 1638 |
23885 | 1639 if ( priv->tv_param->mjpeg ) |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
1640 { |
23149 | 1641 while (ioctl(priv->video_fd, MJPIOC_SYNC, &priv->buf[frame].frame) < 0 && |
1642 (errno == EAGAIN || errno == EINTR)); | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1643 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1644 else |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1645 { |
23149 | 1646 while (ioctl(priv->video_fd, VIDIOCSYNC, &priv->buf[frame].frame) < 0 && |
1647 (errno == EAGAIN || errno == EINTR)); | |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1648 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1649 mp_dbg(MSGT_TV, MSGL_DBG3, "\npicture sync failed\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1650 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1651 gettimeofday(&curtime, NULL); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1652 if (!priv->immediate_mode) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1653 interval = (long long)1e6*curtime.tv_sec + curtime.tv_usec - priv->starttime; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1654 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1655 interval = (long long)1e6*framecount/priv->fps; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1656 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1657 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1658 if (!priv->immediate_mode) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1659 long long period, orig_interval; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1660 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1661 if (tolerance == 0) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1662 if (interval - prev_interval == 0) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1663 mp_msg(MSGT_TV, MSGL_V, "\nvideo capture thread: frame delta = 0\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1664 } else if ((interval - prev_interval < (long long)0.85e6/priv->fps) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1665 || (interval - prev_interval > (long long)1.15e6/priv->fps) ) { |
32352
76f94c00a69f
1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents:
32141
diff
changeset
|
1666 mp_msg(MSGT_TV, MSGL_V, "\nvideo capture thread: frame delta ~ %.1f fps\n", |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1667 (double)1e6/(interval - prev_interval)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1668 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1669 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1670 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1671 // correct the rate fluctuations on a small scale |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1672 orig_interval = interval; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1673 period = priv->video_interval_sum/VIDEO_AVG_BUFFER_SIZE; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1674 if (interval - prev_interval > 105*period/100) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1675 if (tolerance > 0) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1676 mp_msg(MSGT_TV, MSGL_DBG3, "correcting timestamp\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1677 interval = prev_interval + priv->video_interval_sum/VIDEO_AVG_BUFFER_SIZE; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1678 tolerance--; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1679 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1680 mp_msg(MSGT_TV, MSGL_DBG3, "bad - frames were dropped\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1681 tolerance = MAXTOL; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1682 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1683 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1684 if (tolerance < MAXTOL) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1685 mp_msg(MSGT_TV, MSGL_DBG3, "fluctuation overcome\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1686 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1687 tolerance = MAXTOL; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1688 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1689 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1690 priv->video_interval_sum -= priv->video_avg_buffer[priv->video_avg_ptr]; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1691 priv->video_avg_buffer[priv->video_avg_ptr++] = orig_interval-prev_interval; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1692 priv->video_interval_sum += orig_interval-prev_interval; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1693 if (priv->video_avg_ptr >= VIDEO_AVG_BUFFER_SIZE) priv->video_avg_ptr = 0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1694 |
32352
76f94c00a69f
1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents:
32141
diff
changeset
|
1695 // fprintf(stderr, "fps: %f\n", (double)1e6*VIDEO_AVG_BUFFER_SIZE/priv->video_interval_sum); |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1696 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1697 // interpolate the skew in time |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1698 pthread_mutex_lock(&priv->skew_mutex); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1699 xskew = priv->audio_skew + (interval - priv->audio_skew_measure_time)*priv->audio_skew_factor; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1700 pthread_mutex_unlock(&priv->skew_mutex); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1701 // correct extreme skew changes to avoid (especially) moving backwards in time |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1702 if (xskew - prev_skew > (interval - prev_interval)*MAX_SKEW_DELTA) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1703 skew = prev_skew + (interval - prev_interval)*MAX_SKEW_DELTA; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1704 } else if (xskew - prev_skew < -(interval - prev_interval)*MAX_SKEW_DELTA) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1705 skew = prev_skew - (interval - prev_interval)*MAX_SKEW_DELTA; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1706 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1707 skew = xskew; |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
1708 } |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1709 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1710 |
32352
76f94c00a69f
1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents:
32141
diff
changeset
|
1711 mp_msg(MSGT_TV, MSGL_DBG3, "\nfps = %f, interval = %f, a_skew = %f, corr_skew = %f\n", |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1712 (interval != prev_interval) ? (double)1e6/(interval - prev_interval) : -1, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1713 (double)1e-6*interval, (double)1e-6*xskew, (double)1e-6*skew); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1714 mp_msg(MSGT_TV, MSGL_DBG3, "vcnt = %d, acnt = %d\n", priv->video_cnt, priv->audio_cnt); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1715 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1716 prev_skew = skew; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1717 prev_interval = interval; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1718 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1719 /* allocate a new buffer, if needed */ |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1720 pthread_mutex_lock(&priv->video_buffer_mutex); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1721 if (priv->video_buffer_size_current < priv->video_buffer_size_max) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1722 if (priv->video_cnt == priv->video_buffer_size_current) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1723 unsigned char *newbuf = calloc(priv->bytesperline, priv->height); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1724 if (newbuf) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1725 memmove(priv->video_ringbuffer+priv->video_tail+1, priv->video_ringbuffer+priv->video_tail, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1726 (priv->video_buffer_size_current-priv->video_tail)*sizeof(unsigned char *)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1727 memmove(priv->video_timebuffer+priv->video_tail+1, priv->video_timebuffer+priv->video_tail, |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1728 (priv->video_buffer_size_current-priv->video_tail)*sizeof(long long)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1729 priv->video_ringbuffer[priv->video_tail] = newbuf; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1730 if ((priv->video_head >= priv->video_tail) && (priv->video_cnt > 0)) priv->video_head++; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1731 priv->video_buffer_size_current++; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1732 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1733 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1734 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1735 pthread_mutex_unlock(&priv->video_buffer_mutex); |
8650
cf1d4f48aecf
allow utilization of more v4l buffers, patch by Carsten Schulz <carsten@gnocchi.dialup.fu-berlin.de>
henry
parents:
8627
diff
changeset
|
1736 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1737 if (priv->video_cnt == priv->video_buffer_size_current) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1738 if (!priv->immediate_mode) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1739 mp_msg(MSGT_TV, MSGL_ERR, "\nvideo buffer full - dropping frame\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1740 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1741 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1742 if (priv->immediate_mode) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1743 priv->video_timebuffer[priv->video_tail] = interval; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1744 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1745 // compensate for audio skew |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1746 // negative skew => there are more audio samples, increase interval |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1747 // positive skew => less samples, shorten the interval |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1748 priv->video_timebuffer[priv->video_tail] = interval - skew; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1749 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1750 |
23885 | 1751 if ( priv->tv_param->mjpeg ) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1752 copy_frame(priv, priv->video_ringbuffer[priv->video_tail], |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1753 priv->mmap+(priv->mjpeg_bufsize)*i); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1754 else |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1755 copy_frame(priv, priv->video_ringbuffer[priv->video_tail], |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1756 priv->mmap+priv->mbuf.offsets[frame]); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1757 priv->video_tail = (priv->video_tail+1)%priv->video_buffer_size_current; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1758 priv->video_cnt++; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1759 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1760 |
23885 | 1761 if ( priv->tv_param->mjpeg ) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1762 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1763 num = frame; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1764 if (ioctl(priv->video_fd, MJPIOC_QBUF_CAPT, &num) < 0) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1765 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1766 mp_msg(MSGT_TV, MSGL_ERR, "\n MJP: ioctl MJPIOC_QBUF_CAPT end failed: %s\n", |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1767 strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1768 continue; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1769 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1770 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1771 else |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1772 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1773 if (ioctl(priv->video_fd, VIDIOCMCAPTURE, &priv->buf[frame]) == -1) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1774 { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1775 mp_msg(MSGT_TV, MSGL_ERR, "\nioctl mcapture failed: %s\n", strerror(errno)); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1776 continue; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1777 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1778 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1779 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1780 } |
9620
ce4cd85498f3
hardware mjpeg encoding using v4l by Iv«¡n Sz«¡nt«Ñ <szivan@freemail.hu>
henry
parents:
9609
diff
changeset
|
1781 mp_msg(MSGT_TV, MSGL_INFO, " MJP: returning! \n"); |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7318
diff
changeset
|
1782 return NULL; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1783 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1784 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1785 static double grab_video_frame(priv_t *priv, char *buffer, int len) |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1786 { |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1787 double interval; |
2802 | 1788 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1789 if (priv->first) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1790 pthread_create(&priv->video_grabber_thread, NULL, video_grabber, priv); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1791 priv->first = 0; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1792 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1793 |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
1794 while (priv->video_cnt == 0) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1795 usleep(10000); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1796 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1797 |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
1798 pthread_mutex_lock(&priv->video_buffer_mutex); |
8131 | 1799 interval = (double)priv->video_timebuffer[priv->video_head]*1e-6; |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23422
diff
changeset
|
1800 fast_memcpy(buffer, priv->video_ringbuffer[priv->video_head], len); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1801 priv->video_cnt--; |
8671
e1337452fe62
Obvious patch to avoid undefined behaviour of multiple side effects in
arpi
parents:
8650
diff
changeset
|
1802 priv->video_head = (priv->video_head+1)%priv->video_buffer_size_current; |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
1803 pthread_mutex_unlock(&priv->video_buffer_mutex); |
9608 | 1804 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1805 return interval; |
2790 | 1806 } |
1807 | |
1808 static int get_video_framesize(priv_t *priv) | |
1809 { | |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1810 return priv->bytesperline * priv->height; |
2790 | 1811 } |
1812 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1813 static void *audio_grabber(void *data) |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1814 { |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1815 priv_t *priv = (priv_t*)data; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1816 struct timeval tv; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1817 int i, audio_skew_ptr = 0; |
8417
15e3d9c2c0ac
allocate the video buffer on the fly, instead of one big chunk at startup
henry
parents:
8335
diff
changeset
|
1818 long long current_time, prev_skew = 0; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1819 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1820 pthread_mutex_lock(&priv->audio_starter); |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1821 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1822 audio_in_start_capture(&priv->audio_in); |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1823 for (i = 0; i < priv->aud_skew_cnt; i++) |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1824 priv->audio_skew_buffer[i] = 0; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1825 |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1826 for (; !priv->shutdown;) |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1827 { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1828 if (audio_in_read_chunk(&priv->audio_in, priv->audio_ringbuffer+priv->audio_tail*priv->audio_in.blocksize) < 0) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1829 continue; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1830 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1831 gettimeofday(&tv, NULL); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1832 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1833 priv->audio_recv_blocks_total++; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1834 current_time = (long long)1e6*tv.tv_sec + tv.tv_usec - priv->starttime; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1835 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1836 priv->audio_skew_total -= priv->audio_skew_buffer[audio_skew_ptr]; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1837 priv->audio_skew_buffer[audio_skew_ptr] = current_time |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1838 - 1e6*priv->audio_secs_per_block*priv->audio_recv_blocks_total; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1839 priv->audio_skew_total += priv->audio_skew_buffer[audio_skew_ptr]; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1840 audio_skew_ptr = (audio_skew_ptr+1) % priv->aud_skew_cnt; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1841 |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1842 pthread_mutex_lock(&priv->skew_mutex); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1843 // linear interpolation - here we interpolate current skew value |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1844 // from the moving average, which we expect to be in the middle |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1845 // of the interval |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1846 if (priv->audio_recv_blocks_total > priv->aud_skew_cnt) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1847 priv->audio_skew = priv->audio_skew_total/priv->aud_skew_cnt; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1848 priv->audio_skew += (priv->audio_skew*priv->aud_skew_cnt)/(2*priv->audio_recv_blocks_total-priv->aud_skew_cnt); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1849 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1850 // this smoothes the evolution of audio_skew at startup a bit |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1851 priv->audio_skew = ((priv->aud_skew_cnt+priv->audio_recv_blocks_total)*priv->audio_skew_total)/(priv->aud_skew_cnt*priv->audio_recv_blocks_total); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1852 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1853 // current skew factor (assuming linearity) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1854 // used for further interpolation in video_grabber |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1855 // probably overkill but seems to be necessary for |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1856 // stress testing by dropping half of the audio frames ;) |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1857 // especially when using ALSA with large block sizes |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1858 // where audio_skew remains a long while behind |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1859 if ((priv->audio_skew_measure_time != 0) && (current_time - priv->audio_skew_measure_time != 0)) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1860 priv->audio_skew_factor = (double)(priv->audio_skew-prev_skew)/(current_time - priv->audio_skew_measure_time); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1861 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1862 priv->audio_skew_factor = 0.0; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1863 } |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1864 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1865 priv->audio_skew_measure_time = current_time; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1866 prev_skew = priv->audio_skew; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1867 pthread_mutex_unlock(&priv->skew_mutex); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1868 |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1869 if ((priv->audio_tail+1) % priv->audio_buffer_size == priv->audio_head) { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1870 mp_msg(MSGT_TV, MSGL_ERR, "\ntoo bad - dropping audio frame !\n"); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1871 priv->audio_drop++; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1872 } else { |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1873 priv->audio_tail = (priv->audio_tail+1) % priv->audio_buffer_size; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1874 priv->audio_cnt++; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1875 } |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1876 } |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7318
diff
changeset
|
1877 return NULL; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1878 } |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1879 |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5088
diff
changeset
|
1880 static double grab_audio_frame(priv_t *priv, char *buffer, int len) |
2790 | 1881 { |
5088 | 1882 mp_dbg(MSGT_TV, MSGL_DBG2, "grab_audio_frame(priv=%p, buffer=%p, len=%d)\n", |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1883 priv, buffer, len); |
3815 | 1884 |
10776
80402283a017
Fix immediatemode with mplayer (ie playing both sound and video)
albeu
parents:
10621
diff
changeset
|
1885 if (priv->first) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1886 pthread_create(&priv->video_grabber_thread, NULL, video_grabber, priv); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1887 priv->first = 0; |
10776
80402283a017
Fix immediatemode with mplayer (ie playing both sound and video)
albeu
parents:
10621
diff
changeset
|
1888 } |
80402283a017
Fix immediatemode with mplayer (ie playing both sound and video)
albeu
parents:
10621
diff
changeset
|
1889 |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1890 // compensate for dropped audio frames |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1891 if (priv->audio_drop && (priv->audio_head == priv->audio_tail)) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1892 priv->audio_drop--; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1893 priv->audio_sent_blocks_total++; |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1894 memset(buffer, 0, len); |
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1895 return (double)priv->audio_sent_blocks_total*priv->audio_secs_per_block; |
3815 | 1896 } |
1897 | |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1898 while (priv->audio_head == priv->audio_tail) { |
23141
69232417ffde
cosmetics: Remove all trailing whitespace and tabs, indentation fixes.
diego
parents:
22507
diff
changeset
|
1899 usleep(10000); |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1900 } |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23422
diff
changeset
|
1901 fast_memcpy(buffer, priv->audio_ringbuffer+priv->audio_head*priv->audio_in.blocksize, len); |
8671
e1337452fe62
Obvious patch to avoid undefined behaviour of multiple side effects in
arpi
parents:
8650
diff
changeset
|
1902 priv->audio_head = (priv->audio_head+1) % priv->audio_buffer_size; |
7058
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1903 priv->audio_cnt--; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1904 priv->audio_sent_blocks_total++; |
2e5c07262861
new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
6553
diff
changeset
|
1905 return (double)priv->audio_sent_blocks_total*priv->audio_secs_per_block; |
2790 | 1906 } |
1907 | |
1908 static int get_audio_framesize(priv_t *priv) | |
1909 { | |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
25689
diff
changeset
|
1910 return priv->audio_in.blocksize; |
2790 | 1911 } |