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