annotate v4l.c @ 2660:022174d849d5 libavformat

fix issue 225, instead of stoping when wrong atom size is found, limit atom size to what is left, assuming container atom has correct size.. cricket4.3g2 has incorrect moov atom size which indicates that file size should be 2 bytes bigger than it is and quicktime reads it correctly though.
author bcoudurier
date Mon, 22 Oct 2007 14:36:14 +0000
parents 590fa259d1dd
children 59fb7b65fcc6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * Linux video grab interface
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000,2001 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1316
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1316
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1316
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1316
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1316
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1316
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 #include "avformat.h"
2153
6d873194ff86 Fix linking: emms_c is a macro, #include the correct header file.
diego
parents: 2152
diff changeset
22 #include "dsputil.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #include <unistd.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 #include <fcntl.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 #include <sys/ioctl.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 #include <sys/mman.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 #include <sys/time.h>
236
ee98d63dbba7 kernel header bug workaround by (Ronald Bultje <rbultje at ronald dot bitfreak dot net>)
michaelni
parents: 159
diff changeset
28 #define _LINUX_TIME_H 1
ee98d63dbba7 kernel header bug workaround by (Ronald Bultje <rbultje at ronald dot bitfreak dot net>)
michaelni
parents: 159
diff changeset
29 #include <linux/videodev.h>
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 #include <time.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 int fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 int frame_format; /* see VIDEO_PALETTE_xxx */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 int use_mmap;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 int width, height;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 int frame_rate;
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
38 int frame_rate_base;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
39 int64_t time_frame;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 int frame_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 struct video_capability video_cap;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 struct video_audio audio_saved;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
43 uint8_t *video_buf;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 struct video_mbuf gb_buffers;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 struct video_mmap gb_buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 int gb_frame;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 /* ATI All In Wonder specific stuff */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 /* XXX: remove and merge in libavcodec/imgconvert.c */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 int aiw_enabled;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 int deint;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 int halfw;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
53 uint8_t *src_mem;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
54 uint8_t *lum_m4_mem;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 } VideoData;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
57 struct {
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
58 int palette;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
59 int depth;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
60 enum PixelFormat pix_fmt;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
61 } video_formats [] = {
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
62 {.palette = VIDEO_PALETTE_YUV420P, .depth = 12, .pix_fmt = PIX_FMT_YUV420P },
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
63 {.palette = VIDEO_PALETTE_YUV422, .depth = 16, .pix_fmt = PIX_FMT_YUYV422 },
2131
551f836ed80e extending video4linux support to handle the additional formats UYVY, YUYV and RGB565
mhoffman
parents: 2130
diff changeset
64 {.palette = VIDEO_PALETTE_UYVY, .depth = 16, .pix_fmt = PIX_FMT_UYVY422 },
551f836ed80e extending video4linux support to handle the additional formats UYVY, YUYV and RGB565
mhoffman
parents: 2130
diff changeset
65 {.palette = VIDEO_PALETTE_YUYV, .depth = 16, .pix_fmt = PIX_FMT_YUYV422 },
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
66 /* NOTE: v4l uses BGR24, not RGB24 */
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
67 {.palette = VIDEO_PALETTE_RGB24, .depth = 24, .pix_fmt = PIX_FMT_BGR24 },
2131
551f836ed80e extending video4linux support to handle the additional formats UYVY, YUYV and RGB565
mhoffman
parents: 2130
diff changeset
68 {.palette = VIDEO_PALETTE_RGB565, .depth = 16, .pix_fmt = PIX_FMT_BGR565 },
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
69 {.palette = VIDEO_PALETTE_GREY, .depth = 8, .pix_fmt = PIX_FMT_GRAY8 },
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
70 };
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
71
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
72
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 static int aiw_init(VideoData *s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 static int aiw_read_picture(VideoData *s, uint8_t *data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 static int aiw_close(VideoData *s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 VideoData *s = s1->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 int width, height;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 int video_fd, frame_size;
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
83 int ret, frame_rate, frame_rate_base;
1137
246df8e6aab7 Properly set the image depth
lucabe
parents: 1068
diff changeset
84 int desired_palette, desired_depth;
159
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 85
diff changeset
85 struct video_tuner tuner;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 struct video_audio audio;
1068
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
87 struct video_picture pict;
451
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
88 int j;
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
89 int vformat_num = sizeof(video_formats) / sizeof(video_formats[0]);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90
1012
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
91 if (ap->width <= 0 || ap->height <= 0 || ap->time_base.den <= 0) {
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
92 av_log(s1, AV_LOG_ERROR, "Bad capture size (%dx%d) or wrong time base (%d)\n",
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
93 ap->width, ap->height, ap->time_base.den);
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
94
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 return -1;
1012
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
96 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
97
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 width = ap->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 height = ap->height;
743
af4e24d6310c switch to native time bases
michael
parents: 639
diff changeset
100 frame_rate = ap->time_base.den;
af4e24d6310c switch to native time bases
michael
parents: 639
diff changeset
101 frame_rate_base = ap->time_base.num;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102
1012
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
103 if((unsigned)width > 32767 || (unsigned)height > 32767) {
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
104 av_log(s1, AV_LOG_ERROR, "Capture size is out of range: %dx%d\n",
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
105 width, height);
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
106
639
0b52743104ac integer overflows, heap corruption
michael
parents: 482
diff changeset
107 return -1;
1012
9a88a1f43ea9 Tell the user why video capture is failing
lucabe
parents: 1003
diff changeset
108 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
109
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 st = av_new_stream(s1, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 if (!st)
1787
eb16c64144ee This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents: 1760
diff changeset
112 return AVERROR(ENOMEM);
921
547675092e98 video4linux2 input support
diego
parents: 896
diff changeset
113 av_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 s->width = width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 s->height = height;
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
117 s->frame_rate = frame_rate;
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
118 s->frame_rate_base = frame_rate_base;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119
1795
62792a60f740 implement new grabbing interface, as described here:
gpoirier
parents: 1787
diff changeset
120 video_fd = open(s1->filename, O_RDWR);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 if (video_fd < 0) {
1795
62792a60f740 implement new grabbing interface, as described here:
gpoirier
parents: 1787
diff changeset
122 perror(s1->filename);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
125
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 if (ioctl(video_fd,VIDIOCGCAP, &s->video_cap) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 perror("VIDIOCGCAP");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 if (!(s->video_cap.type & VID_TYPE_CAPTURE)) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
132 av_log(s1, AV_LOG_ERROR, "Fatal: grab device does not handle capture\n");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 desired_palette = -1;
1137
246df8e6aab7 Properly set the image depth
lucabe
parents: 1068
diff changeset
137 desired_depth = -1;
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
138 for (j = 0; j < vformat_num; j++) {
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
139 if (ap->pix_fmt == video_formats[j].pix_fmt) {
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
140 desired_palette = video_formats[j].palette;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
141 desired_depth = video_formats[j].depth;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
142 break;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
143 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
144 }
159
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 85
diff changeset
145
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 85
diff changeset
146 /* set tv standard */
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 85
diff changeset
147 if (ap->standard && !ioctl(video_fd, VIDIOCGTUNER, &tuner)) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
148 if (!strcasecmp(ap->standard, "pal"))
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
149 tuner.mode = VIDEO_MODE_PAL;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
150 else if (!strcasecmp(ap->standard, "secam"))
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
151 tuner.mode = VIDEO_MODE_SECAM;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
152 else
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
153 tuner.mode = VIDEO_MODE_NTSC;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
154 ioctl(video_fd, VIDIOCSTUNER, &tuner);
159
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 85
diff changeset
155 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
156
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 /* unmute audio */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 audio.audio = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 ioctl(video_fd, VIDIOCGAUDIO, &audio);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 memcpy(&s->audio_saved, &audio, sizeof(audio));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 audio.flags &= ~VIDEO_AUDIO_MUTE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 ioctl(video_fd, VIDIOCSAUDIO, &audio);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163
1068
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
164 ioctl(video_fd, VIDIOCGPICT, &pict);
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
165 #if 0
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
166 printf("v4l: colour=%d hue=%d brightness=%d constrast=%d whiteness=%d\n",
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
167 pict.colour,
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
168 pict.hue,
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
169 pict.brightness,
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
170 pict.contrast,
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
171 pict.whiteness);
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
172 #endif
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
173 /* try to choose a suitable video format */
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
174 pict.palette = desired_palette;
1137
246df8e6aab7 Properly set the image depth
lucabe
parents: 1068
diff changeset
175 pict.depth= desired_depth;
1068
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
176 if (desired_palette == -1 || (ret = ioctl(video_fd, VIDIOCSPICT, &pict)) < 0) {
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
177 for (j = 0; j < vformat_num; j++) {
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
178 pict.palette = video_formats[j].palette;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
179 pict.depth = video_formats[j].depth;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
180 if (-1 != ioctl(video_fd, VIDIOCSPICT, &pict))
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
181 break;
1068
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
182 }
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
183 if (j >= vformat_num)
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
184 goto fail1;
1068
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
185 }
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
186
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 ret = ioctl(video_fd,VIDIOCGMBUF,&s->gb_buffers);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
188 if (ret < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 /* try to use read based access */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 struct video_window win;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 int val;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 win.x = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 win.y = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 win.width = width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 win.height = height;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 win.chromakey = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 win.flags = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 ioctl(video_fd, VIDIOCSWIN, &win);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202 s->frame_format = pict.palette;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 val = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 ioctl(video_fd, VIDIOCCAPTURE, &val);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206
455
e5174af0f52f fix rounding errors with NTSC patch by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 451
diff changeset
207 s->time_frame = av_gettime() * s->frame_rate / s->frame_rate_base;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 s->use_mmap = 0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
209
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 /* ATI All In Wonder automatic activation */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 if (!strcmp(s->video_cap.name, "Km")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 if (aiw_init(s) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 s->aiw_enabled = 1;
2268
8064e86dfe77 typo fixes
diego
parents: 2153
diff changeset
215 /* force 420P format because conversion from YUV422 to YUV420P
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 is done in this driver (ugly) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 s->frame_format = VIDEO_PALETTE_YUV420P;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
220 s->video_buf = mmap(0,s->gb_buffers.size,PROT_READ|PROT_WRITE,MAP_SHARED,video_fd,0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 if ((unsigned char*)-1 == s->video_buf) {
1604
ec546897df3d fall back mmap() call using MAP_PRIVATE for working on no-mmu systems
aurel
parents: 1556
diff changeset
222 s->video_buf = mmap(0,s->gb_buffers.size,PROT_READ|PROT_WRITE,MAP_PRIVATE,video_fd,0);
ec546897df3d fall back mmap() call using MAP_PRIVATE for working on no-mmu systems
aurel
parents: 1556
diff changeset
223 if ((unsigned char*)-1 == s->video_buf) {
ec546897df3d fall back mmap() call using MAP_PRIVATE for working on no-mmu systems
aurel
parents: 1556
diff changeset
224 perror("mmap");
ec546897df3d fall back mmap() call using MAP_PRIVATE for working on no-mmu systems
aurel
parents: 1556
diff changeset
225 goto fail;
ec546897df3d fall back mmap() call using MAP_PRIVATE for working on no-mmu systems
aurel
parents: 1556
diff changeset
226 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228 s->gb_frame = 0;
455
e5174af0f52f fix rounding errors with NTSC patch by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 451
diff changeset
229 s->time_frame = av_gettime() * s->frame_rate / s->frame_rate_base;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
230
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 /* start to grab the first frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 s->gb_buf.frame = s->gb_frame % s->gb_buffers.frames;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233 s->gb_buf.height = height;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 s->gb_buf.width = width;
1068
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
235 s->gb_buf.format = pict.palette;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
236
1068
b14b8b976bce Fix v4l grabbing with some webcams, and simplify the code.
lucabe
parents: 1012
diff changeset
237 ret = ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
238 if (ret < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239 if (errno != EAGAIN) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 fail1:
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 236
diff changeset
241 av_log(s1, AV_LOG_ERROR, "Fatal: grab device does not support suitable format\n");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242 } else {
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 236
diff changeset
243 av_log(s1, AV_LOG_ERROR,"Fatal: grab device does not receive any video signal\n");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 }
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
247 for (j = 1; j < s->gb_buffers.frames; j++) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
248 s->gb_buf.frame = j;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
249 ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
250 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 s->frame_format = s->gb_buf.format;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 s->use_mmap = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
255 for (j = 0; j < vformat_num; j++) {
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
256 if (s->frame_format == video_formats[j].palette) {
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
257 frame_size = width * height * video_formats[j].depth / 8;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
258 st->codec->pix_fmt = video_formats[j].pix_fmt;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
259 break;
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
260 }
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
261 }
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
262
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
263 if (j >= vformat_num)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 goto fail;
2130
861cfbc6297a convert if then else video palette to pix_fmt construct to simpiler table based lookup.
mhoffman
parents: 2087
diff changeset
265
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 s->fd = video_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 s->frame_size = frame_size;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
268
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 743
diff changeset
269 st->codec->codec_type = CODEC_TYPE_VIDEO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 743
diff changeset
270 st->codec->codec_id = CODEC_ID_RAWVIDEO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 743
diff changeset
271 st->codec->width = width;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 743
diff changeset
272 st->codec->height = height;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 743
diff changeset
273 st->codec->time_base.den = frame_rate;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 743
diff changeset
274 st->codec->time_base.num = frame_rate_base;
861
728a86721270 lame bit_rate calculation
alex
parents: 820
diff changeset
275 st->codec->bit_rate = frame_size * 1/av_q2d(st->codec->time_base) * 8;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279 if (video_fd >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280 close(video_fd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 av_free(st);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2268
diff changeset
282 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
285 static int v4l_mm_read_picture(VideoData *s, uint8_t *buf)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
287 uint8_t *ptr;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288
451
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
289 while (ioctl(s->fd, VIDIOCSYNC, &s->gb_frame) < 0 &&
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
290 (errno == EAGAIN || errno == EINTR));
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
291
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
292 ptr = s->video_buf + s->gb_buffers.offsets[s->gb_frame];
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
293 memcpy(buf, ptr, s->frame_size);
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
294
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 /* Setup to capture the next frame */
451
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
296 s->gb_buf.frame = s->gb_frame;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 if (ioctl(s->fd, VIDIOCMCAPTURE, &s->gb_buf) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298 if (errno == EAGAIN)
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 236
diff changeset
299 av_log(NULL, AV_LOG_ERROR, "Cannot Sync\n");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 perror("VIDIOCMCAPTURE");
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2268
diff changeset
302 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 /* This is now the grabbing frame */
451
31784bdb76ee ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 370
diff changeset
306 s->gb_frame = (s->gb_frame + 1) % s->gb_buffers.frames;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 return s->frame_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311 static int grab_read_packet(AVFormatContext *s1, AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 VideoData *s = s1->priv_data;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
314 int64_t curtime, delay;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 struct timespec ts;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
316
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 /* Calculate the time of the next frame */
1556
65b7b3ff4ed7 use the standard INT64_C() macro for 64-bit constants
mru
parents: 1491
diff changeset
318 s->time_frame += INT64_C(1000000);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320 /* wait based on the frame rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 curtime = av_gettime();
455
e5174af0f52f fix rounding errors with NTSC patch by (Luca Abeni <lucabe72 at email dot it>)
michael
parents: 451
diff changeset
323 delay = s->time_frame * s->frame_rate_base / s->frame_rate - curtime;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
324 if (delay <= 0) {
1556
65b7b3ff4ed7 use the standard INT64_C() macro for 64-bit constants
mru
parents: 1491
diff changeset
325 if (delay < INT64_C(-1000000) * s->frame_rate_base / s->frame_rate) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 /* printf("grabbing is %d frames late (dropping)\n", (int) -(delay / 16666)); */
1556
65b7b3ff4ed7 use the standard INT64_C() macro for 64-bit constants
mru
parents: 1491
diff changeset
327 s->time_frame += INT64_C(1000000);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 break;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
330 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331 ts.tv_sec = delay / 1000000;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 ts.tv_nsec = (delay % 1000000) * 1000;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 nanosleep(&ts, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 if (av_new_packet(pkt, s->frame_size) < 0)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2268
diff changeset
337 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338
921
547675092e98 video4linux2 input support
diego
parents: 896
diff changeset
339 pkt->pts = curtime;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341 /* read one frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342 if (s->aiw_enabled) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
343 return aiw_read_picture(s, pkt->data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 } else if (s->use_mmap) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
345 return v4l_mm_read_picture(s, pkt->data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 if (read(s->fd, pkt->data, pkt->size) != pkt->size)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2268
diff changeset
348 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 return s->frame_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
351 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
352
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 static int grab_read_close(AVFormatContext *s1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
354 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
355 VideoData *s = s1->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
356
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
357 if (s->aiw_enabled)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
358 aiw_close(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
359
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
360 if (s->use_mmap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 munmap(s->video_buf, s->gb_buffers.size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
363 /* mute audio. we must force it because the BTTV driver does not
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
364 return its state correctly */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
365 s->audio_saved.flags |= VIDEO_AUDIO_MUTE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
366 ioctl(s->fd, VIDIOCSAUDIO, &s->audio_saved);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
367
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
368 close(s->fd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
369 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
371
2526
7d80b6e8adec Remove video_grab_ prefix from video_grab_{bktr,v4l}
ramiro
parents: 2274
diff changeset
372 AVInputFormat v4l_demuxer = {
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents: 0
diff changeset
373 "video4linux",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
374 "video grab",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375 sizeof(VideoData),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
377 grab_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378 grab_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 grab_read_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 .flags = AVFMT_NOFILE,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 /* All in Wonder specific stuff */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 /* XXX: remove and merge in libavcodec/imgconvert.c */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386 static int aiw_init(VideoData *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
388 int width, height;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
390 width = s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
391 height = s->height;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
392
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 if ((width == s->video_cap.maxwidth && height == s->video_cap.maxheight) ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394 (width == s->video_cap.maxwidth && height == s->video_cap.maxheight*2) ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 (width == s->video_cap.maxwidth/2 && height == s->video_cap.maxheight)) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
396
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397 s->deint=0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 s->halfw=0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 if (height == s->video_cap.maxheight*2) s->deint=1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 if (width == s->video_cap.maxwidth/2) s->halfw=1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401 } else {
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 236
diff changeset
402 av_log(NULL, AV_LOG_ERROR, "\nIncorrect Grab Size Supplied - Supported Sizes Are:\n");
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 236
diff changeset
403 av_log(NULL, AV_LOG_ERROR, " %dx%d %dx%d %dx%d\n\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 s->video_cap.maxwidth,s->video_cap.maxheight,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
405 s->video_cap.maxwidth,s->video_cap.maxheight*2,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
406 s->video_cap.maxwidth/2,s->video_cap.maxheight);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
407 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
408 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
409
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
410 if (s->halfw == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
411 s->src_mem = av_malloc(s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
412 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
413 s->src_mem = av_malloc(s->width*4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
414 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415 if (!s->src_mem) goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417 s->lum_m4_mem = av_malloc(s->width);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418 if (!s->lum_m4_mem)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
419 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
421 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422 av_freep(&s->src_mem);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 av_freep(&s->lum_m4_mem);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
424 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
425 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
426
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427 #ifdef HAVE_MMX
2087
fa4066708500 Drop unnecessary libavcodec/ prefix in #include path.
diego
parents: 1982
diff changeset
428 #include "i386/mmx.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
429
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
430 #define LINE_WITH_UV \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431 movq_m2r(ptr[0],mm0); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432 movq_m2r(ptr[8],mm1); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 movq_r2r(mm0, mm4); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434 punpcklbw_r2r(mm1,mm0); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
435 punpckhbw_r2r(mm1,mm4); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
436 movq_r2r(mm0,mm5); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
437 punpcklbw_r2r(mm4,mm0); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
438 punpckhbw_r2r(mm4,mm5); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
439 movq_r2r(mm0,mm1); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
440 punpcklbw_r2r(mm5,mm1); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
441 movq_r2m(mm1,lum[0]); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
442 movq_m2r(ptr[16],mm2); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
443 movq_m2r(ptr[24],mm1); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
444 movq_r2r(mm2,mm4); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
445 punpcklbw_r2r(mm1,mm2); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
446 punpckhbw_r2r(mm1,mm4); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447 movq_r2r(mm2,mm3); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448 punpcklbw_r2r(mm4,mm2); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449 punpckhbw_r2r(mm4,mm3); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 movq_r2r(mm2,mm1); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451 punpcklbw_r2r(mm3,mm1); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
452 movq_r2m(mm1,lum[8]); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453 punpckhdq_r2r(mm2,mm0); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
454 punpckhdq_r2r(mm3,mm5); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455 movq_r2m(mm0,cb[0]); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 movq_r2m(mm5,cr[0]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 #define LINE_NO_UV \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
459 movq_m2r(ptr[0],mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
460 movq_m2r(ptr[8],mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 movq_r2r(mm0, mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 punpcklbw_r2r(mm1,mm0); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463 punpckhbw_r2r(mm1,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464 movq_r2r(mm0,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465 punpcklbw_r2r(mm4,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 punpckhbw_r2r(mm4,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467 movq_r2r(mm0,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468 punpcklbw_r2r(mm5,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
469 movq_r2m(mm1,lum[0]);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
470 movq_m2r(ptr[16],mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
471 movq_m2r(ptr[24],mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
472 movq_r2r(mm2,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473 punpcklbw_r2r(mm1,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474 punpckhbw_r2r(mm1,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
475 movq_r2r(mm2,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
476 punpcklbw_r2r(mm4,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
477 punpckhbw_r2r(mm4,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
478 movq_r2r(mm2,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
479 punpcklbw_r2r(mm3,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
480 movq_r2m(mm1,lum[8]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
481
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
482 #define LINE_WITHUV_AVG \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
483 movq_m2r(ptr[0], mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
484 movq_m2r(ptr[8], mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
485 movq_r2r(mm0, mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
486 punpcklbw_r2r(mm1,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
487 punpckhbw_r2r(mm1,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
488 movq_r2r(mm0,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
489 punpcklbw_r2r(mm4,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
490 punpckhbw_r2r(mm4,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
491 movq_r2r(mm0,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
492 movq_r2r(mm5,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
493 punpcklbw_r2r(mm7,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
494 punpcklbw_r2r(mm7,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
495 paddw_r2r(mm6,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
496 paddw_r2r(mm2,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
497 psraw_i2r(1,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
498 packuswb_r2r(mm7,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
499 movd_r2m(mm1,lum[0]);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
500 movq_m2r(ptr[16],mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
501 movq_m2r(ptr[24],mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
502 movq_r2r(mm2,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
503 punpcklbw_r2r(mm1,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
504 punpckhbw_r2r(mm1,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
505 movq_r2r(mm2,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
506 punpcklbw_r2r(mm4,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
507 punpckhbw_r2r(mm4,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
508 movq_r2r(mm2,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
509 movq_r2r(mm3,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
510 punpcklbw_r2r(mm7,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
511 punpcklbw_r2r(mm7,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
512 paddw_r2r(mm6,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
513 paddw_r2r(mm4,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
514 psraw_i2r(1,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
515 packuswb_r2r(mm7,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
516 movd_r2m(mm1,lum[4]);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
517 punpckhbw_r2r(mm7,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
518 punpckhbw_r2r(mm7,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
519 paddw_r2r(mm6,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
520 paddw_r2r(mm2,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
521 psraw_i2r(1,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
522 packuswb_r2r(mm7,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
523 punpckhbw_r2r(mm7,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
524 punpckhbw_r2r(mm7,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
525 paddw_r2r(mm6,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
526 paddw_r2r(mm3,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
527 psraw_i2r(1,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
528 packuswb_r2r(mm7,mm5);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
529 movd_r2m(mm0,cb[0]);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
530 movd_r2m(mm5,cr[0]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
531
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
532 #define LINE_NOUV_AVG \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
533 movq_m2r(ptr[0],mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
534 movq_m2r(ptr[8],mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
535 pand_r2r(mm5,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
536 pand_r2r(mm5,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
537 pmaddwd_r2r(mm6,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
538 pmaddwd_r2r(mm6,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
539 packssdw_r2r(mm1,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
540 paddw_r2r(mm6,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
541 psraw_i2r(1,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
542 movq_m2r(ptr[16],mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
543 movq_m2r(ptr[24],mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
544 pand_r2r(mm5,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
545 pand_r2r(mm5,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
546 pmaddwd_r2r(mm6,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
547 pmaddwd_r2r(mm6,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
548 packssdw_r2r(mm3,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
549 paddw_r2r(mm6,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
550 psraw_i2r(1,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
551 packuswb_r2r(mm2,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
552 movq_r2m(mm0,lum[0]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
553
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
554 #define DEINT_LINE_LUM(ptroff) \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
555 movd_m2r(lum_m4[(ptroff)],mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
556 movd_m2r(lum_m3[(ptroff)],mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
557 movd_m2r(lum_m2[(ptroff)],mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
558 movd_m2r(lum_m1[(ptroff)],mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
559 movd_m2r(lum[(ptroff)],mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
560 punpcklbw_r2r(mm7,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
561 movd_r2m(mm2,lum_m4[(ptroff)]);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
562 punpcklbw_r2r(mm7,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
563 punpcklbw_r2r(mm7,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
564 punpcklbw_r2r(mm7,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
565 punpcklbw_r2r(mm7,mm4);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
566 psllw_i2r(2,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
567 psllw_i2r(1,mm2);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
568 paddw_r2r(mm6,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
569 psllw_i2r(2,mm3);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
570 paddw_r2r(mm2,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
571 paddw_r2r(mm4,mm0);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
572 paddw_r2r(mm3,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
573 psubusw_r2r(mm0,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
574 psrlw_i2r(3,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
575 packuswb_r2r(mm7,mm1);\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
576 movd_r2m(mm1,lum_m2[(ptroff)]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
577
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
578 #else
2087
fa4066708500 Drop unnecessary libavcodec/ prefix in #include path.
diego
parents: 1982
diff changeset
579 #include "dsputil.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
580
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
581 #define LINE_WITH_UV \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
582 lum[0]=ptr[0];lum[1]=ptr[2];lum[2]=ptr[4];lum[3]=ptr[6];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
583 cb[0]=ptr[1];cb[1]=ptr[5];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
584 cr[0]=ptr[3];cr[1]=ptr[7];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
585 lum[4]=ptr[8];lum[5]=ptr[10];lum[6]=ptr[12];lum[7]=ptr[14];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
586 cb[2]=ptr[9];cb[3]=ptr[13];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
587 cr[2]=ptr[11];cr[3]=ptr[15];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
588 lum[8]=ptr[16];lum[9]=ptr[18];lum[10]=ptr[20];lum[11]=ptr[22];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
589 cb[4]=ptr[17];cb[5]=ptr[21];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
590 cr[4]=ptr[19];cr[5]=ptr[23];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
591 lum[12]=ptr[24];lum[13]=ptr[26];lum[14]=ptr[28];lum[15]=ptr[30];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
592 cb[6]=ptr[25];cb[7]=ptr[29];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
593 cr[6]=ptr[27];cr[7]=ptr[31];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
594
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
595 #define LINE_NO_UV \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
596 lum[0]=ptr[0];lum[1]=ptr[2];lum[2]=ptr[4];lum[3]=ptr[6];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
597 lum[4]=ptr[8];lum[5]=ptr[10];lum[6]=ptr[12];lum[7]=ptr[14];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
598 lum[8]=ptr[16];lum[9]=ptr[18];lum[10]=ptr[20];lum[11]=ptr[22];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
599 lum[12]=ptr[24];lum[13]=ptr[26];lum[14]=ptr[28];lum[15]=ptr[30];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
600
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
601 #define LINE_WITHUV_AVG \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
602 sum=(ptr[0]+ptr[2]+1) >> 1;lum[0]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
603 sum=(ptr[4]+ptr[6]+1) >> 1;lum[1]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
604 sum=(ptr[1]+ptr[5]+1) >> 1;cb[0]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 sum=(ptr[3]+ptr[7]+1) >> 1;cr[0]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
606 sum=(ptr[8]+ptr[10]+1) >> 1;lum[2]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
607 sum=(ptr[12]+ptr[14]+1) >> 1;lum[3]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
608 sum=(ptr[9]+ptr[13]+1) >> 1;cb[1]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
609 sum=(ptr[11]+ptr[15]+1) >> 1;cr[1]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
610 sum=(ptr[16]+ptr[18]+1) >> 1;lum[4]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
611 sum=(ptr[20]+ptr[22]+1) >> 1;lum[5]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
612 sum=(ptr[17]+ptr[21]+1) >> 1;cb[2]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
613 sum=(ptr[19]+ptr[23]+1) >> 1;cr[2]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
614 sum=(ptr[24]+ptr[26]+1) >> 1;lum[6]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
615 sum=(ptr[28]+ptr[30]+1) >> 1;lum[7]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
616 sum=(ptr[25]+ptr[29]+1) >> 1;cb[3]=sum; \
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
617 sum=(ptr[27]+ptr[31]+1) >> 1;cr[3]=sum;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
618
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
619 #define LINE_NOUV_AVG \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
620 sum=(ptr[0]+ptr[2]+1) >> 1;lum[0]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
621 sum=(ptr[4]+ptr[6]+1) >> 1;lum[1]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
622 sum=(ptr[8]+ptr[10]+1) >> 1;lum[2]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
623 sum=(ptr[12]+ptr[14]+1) >> 1;lum[3]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
624 sum=(ptr[16]+ptr[18]+1) >> 1;lum[4]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
625 sum=(ptr[20]+ptr[22]+1) >> 1;lum[5]=sum; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
626 sum=(ptr[24]+ptr[26]+1) >> 1;lum[6]=sum; \
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 878
diff changeset
627 sum=(ptr[28]+ptr[30]+1) >> 1;lum[7]=sum;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
628
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
629 #define DEINT_LINE_LUM(ptroff) \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
630 sum=(-lum_m4[(ptroff)]+(lum_m3[(ptroff)]<<2)+(lum_m2[(ptroff)]<<1)+(lum_m1[(ptroff)]<<2)-lum[(ptroff)]); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
631 lum_m4[(ptroff)]=lum_m2[(ptroff)];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
632 lum_m2[(ptroff)]=cm[(sum+4)>>3];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
633 sum=(-lum_m4[(ptroff)+1]+(lum_m3[(ptroff)+1]<<2)+(lum_m2[(ptroff)+1]<<1)+(lum_m1[(ptroff)+1]<<2)-lum[(ptroff)+1]); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
634 lum_m4[(ptroff)+1]=lum_m2[(ptroff)+1];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
635 lum_m2[(ptroff)+1]=cm[(sum+4)>>3];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
636 sum=(-lum_m4[(ptroff)+2]+(lum_m3[(ptroff)+2]<<2)+(lum_m2[(ptroff)+2]<<1)+(lum_m1[(ptroff)+2]<<2)-lum[(ptroff)+2]); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
637 lum_m4[(ptroff)+2]=lum_m2[(ptroff)+2];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
638 lum_m2[(ptroff)+2]=cm[(sum+4)>>3];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
639 sum=(-lum_m4[(ptroff)+3]+(lum_m3[(ptroff)+3]<<2)+(lum_m2[(ptroff)+3]<<1)+(lum_m1[(ptroff)+3]<<2)-lum[(ptroff)+3]); \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
640 lum_m4[(ptroff)+3]=lum_m2[(ptroff)+3];\
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
641 lum_m2[(ptroff)+3]=cm[(sum+4)>>3];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
642
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
643 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
644
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
645
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
646 /* Read two fields separately. */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
647 static int aiw_read_picture(VideoData *s, uint8_t *data)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
648 {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
649 uint8_t *ptr, *lum, *cb, *cr;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
650 int h;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
651 #ifndef HAVE_MMX
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
652 int sum;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
653 #endif
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
654 uint8_t* src = s->src_mem;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
655 uint8_t *ptrend = &src[s->width*2];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
656 lum=data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
657 cb=&lum[s->width*s->height];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
658 cr=&cb[(s->width*s->height)/4];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
659 if (s->deint == 0 && s->halfw == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
660 while (read(s->fd,src,s->width*2) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
661 usleep(100);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
662 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
663 for (h = 0; h < s->height-2; h+=2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
664 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16, cb+=8, cr+=8) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
665 LINE_WITH_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
666 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
667 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
668 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
669 LINE_NO_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
670 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
671 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
672 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
673 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
674 * Do last two lines
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
675 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
676 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16, cb+=8, cr+=8) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
677 LINE_WITH_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
678 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
679 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
680 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
681 LINE_NO_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
682 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
683 /* drop second field */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
684 while (read(s->fd,src,s->width*2) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
685 usleep(100);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
686 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
687 for (h = 0; h < s->height - 1; h++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
688 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
689 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
690 } else if (s->halfw == 1) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
691 #ifdef HAVE_MMX
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
692 mmx_t rounder;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
693 mmx_t masker;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
694 rounder.uw[0]=1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
695 rounder.uw[1]=1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
696 rounder.uw[2]=1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
697 rounder.uw[3]=1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
698 masker.ub[0]=0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
699 masker.ub[1]=0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
700 masker.ub[2]=0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
701 masker.ub[3]=0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
702 masker.ub[4]=0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
703 masker.ub[5]=0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
704 masker.ub[6]=0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
705 masker.ub[7]=0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
706 pxor_r2r(mm7,mm7);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
707 movq_m2r(rounder,mm6);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
708 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
709 while (read(s->fd,src,s->width*4) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
710 usleep(100);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
711 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
712 ptrend = &src[s->width*4];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
713 for (h = 0; h < s->height-2; h+=2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
714 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=8, cb+=4, cr+=4) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
715 LINE_WITHUV_AVG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
716 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
717 read(s->fd,src,s->width*4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
718 #ifdef HAVE_MMX
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
719 movq_m2r(masker,mm5);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
720 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
721 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=8) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
722 LINE_NOUV_AVG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
723 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
724 read(s->fd,src,s->width*4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
725 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
726 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
727 * Do last two lines
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
728 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
729 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=8, cb+=4, cr+=4) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
730 LINE_WITHUV_AVG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
731 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
732 read(s->fd,src,s->width*4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
733 #ifdef HAVE_MMX
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
734 movq_m2r(masker,mm5);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
735 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
736 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=8) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
737 LINE_NOUV_AVG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
738 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
739 /* drop second field */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
740 while (read(s->fd,src,s->width*4) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
741 usleep(100);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
742 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
743 for (h = 0; h < s->height - 1; h++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
744 read(s->fd,src,s->width*4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
745 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
746 } else {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 30
diff changeset
747 uint8_t *lum_m1, *lum_m2, *lum_m3, *lum_m4;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
748 #ifdef HAVE_MMX
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
749 mmx_t rounder;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
750 rounder.uw[0]=4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
751 rounder.uw[1]=4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
752 rounder.uw[2]=4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
753 rounder.uw[3]=4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
754 movq_m2r(rounder,mm6);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
755 pxor_r2r(mm7,mm7);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
756 #else
1491
89f88d324eea rename cropTbl -> ff_cropTbl
mru
parents: 1358
diff changeset
757 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
758 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
759
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
760 /* read two fields and deinterlace them */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
761 while (read(s->fd,src,s->width*2) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
762 usleep(100);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
763 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
764 for (h = 0; h < (s->height/2)-2; h+=2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
765 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16, cb+=8, cr+=8) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
766 LINE_WITH_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
767 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
769 /* skip a luminance line - will be filled in later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
770 lum += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16, cb+=8, cr+=8) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772 LINE_WITH_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 /* skip a luminance line - will be filled in later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
775 lum += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
776 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
777 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779 * Do last two lines
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
780 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
781 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16, cb+=8, cr+=8) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782 LINE_WITH_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
783 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
784 /* skip a luminance line - will be filled in later */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
785 lum += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
786 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
787 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16, cb+=8, cr+=8) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
788 LINE_WITH_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
789 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
790 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
791 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
792 * SECOND FIELD
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
793 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
794 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
795 lum=&data[s->width];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
796 while (read(s->fd,src,s->width*2) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
797 usleep(10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
798 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
799 /* First (and last) two lines not interlaced */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
800 for (h = 0; h < 2; h++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
801 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
802 LINE_NO_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
803 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
804 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
805 /* skip a luminance line */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
806 lum += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
807 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
808 lum_m1=&lum[-s->width];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
809 lum_m2=&lum_m1[-s->width];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
810 lum_m3=&lum_m2[-s->width];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
811 memmove(s->lum_m4_mem,&lum_m3[-s->width],s->width);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
812 for (; h < (s->height/2)-1; h++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
813 lum_m4=s->lum_m4_mem;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
814 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16,lum_m1+=16,lum_m2+=16,lum_m3+=16,lum_m4+=16) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
815 LINE_NO_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
816
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
817 DEINT_LINE_LUM(0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
818 DEINT_LINE_LUM(4)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
819 DEINT_LINE_LUM(8)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
820 DEINT_LINE_LUM(12)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
821 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
822 read(s->fd,src,s->width*2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
823 /* skip a luminance line */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
824 lum += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
825 lum_m1 += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
826 lum_m2 += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
827 lum_m3 += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
828 // lum_m4 += s->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
829 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
830 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
831 * Do last line
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
832 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
833 lum_m4=s->lum_m4_mem;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
834 for (ptr = &src[0]; ptr < ptrend; ptr+=32, lum+=16, lum_m1+=16, lum_m2+=16, lum_m3+=16, lum_m4+=16) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
835 LINE_NO_UV
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
836
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
837 DEINT_LINE_LUM(0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
838 DEINT_LINE_LUM(4)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
839 DEINT_LINE_LUM(8)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
840 DEINT_LINE_LUM(12)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
841 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
842 }
2152
5493fd53a671 emms --> emms_c, patch by Ronald S. Bultje, rbultje ronald.bitfreak net
diego
parents: 2131
diff changeset
843 emms_c();
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
844 return s->frame_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
845 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
846
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
847 static int aiw_close(VideoData *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
848 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
849 av_freep(&s->lum_m4_mem);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
850 av_freep(&s->src_mem);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
851 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
852 }