aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/videodev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/videodev.c')
-rw-r--r--drivers/media/video/videodev.c245
1 files changed, 68 insertions, 177 deletions
diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c
index e5679c28163f..7649860a388d 100644
--- a/drivers/media/video/videodev.c
+++ b/drivers/media/video/videodev.c
@@ -52,12 +52,51 @@
52#define VIDEO_NUM_DEVICES 256 52#define VIDEO_NUM_DEVICES 256
53#define VIDEO_NAME "video4linux" 53#define VIDEO_NAME "video4linux"
54 54
55struct std_descr {
56 v4l2_std_id std;
57 const char *descr;
58};
59
60static const struct std_descr standards[] = {
61 { V4L2_STD_NTSC, "NTSC" },
62 { V4L2_STD_NTSC_M, "NTSC-M" },
63 { V4L2_STD_NTSC_M_JP, "NTSC-M-JP" },
64 { V4L2_STD_NTSC_M_KR, "NTSC-M-KR" },
65 { V4L2_STD_NTSC_443, "NTSC-443" },
66 { V4L2_STD_PAL, "PAL" },
67 { V4L2_STD_PAL_BG, "PAL-BG" },
68 { V4L2_STD_PAL_B, "PAL-B" },
69 { V4L2_STD_PAL_B1, "PAL-B1" },
70 { V4L2_STD_PAL_G, "PAL-G" },
71 { V4L2_STD_PAL_H, "PAL-H" },
72 { V4L2_STD_PAL_I, "PAL-I" },
73 { V4L2_STD_PAL_DK, "PAL-DK" },
74 { V4L2_STD_PAL_D, "PAL-D" },
75 { V4L2_STD_PAL_D1, "PAL-D1" },
76 { V4L2_STD_PAL_K, "PAL-K" },
77 { V4L2_STD_PAL_M, "PAL-M" },
78 { V4L2_STD_PAL_N, "PAL-N" },
79 { V4L2_STD_PAL_Nc, "PAL-Nc" },
80 { V4L2_STD_PAL_60, "PAL-60" },
81 { V4L2_STD_SECAM, "SECAM" },
82 { V4L2_STD_SECAM_B, "SECAM-B" },
83 { V4L2_STD_SECAM_G, "SECAM-G" },
84 { V4L2_STD_SECAM_H, "SECAM-H" },
85 { V4L2_STD_SECAM_DK, "SECAM-DK" },
86 { V4L2_STD_SECAM_D, "SECAM-D" },
87 { V4L2_STD_SECAM_K, "SECAM-K" },
88 { V4L2_STD_SECAM_K1, "SECAM-K1" },
89 { V4L2_STD_SECAM_L, "SECAM-L" },
90 { V4L2_STD_SECAM_LC, "SECAM-Lc" },
91 { 0, "Unknown" }
92};
93
55/* video4linux standard ID conversion to standard name 94/* video4linux standard ID conversion to standard name
56 */ 95 */
57char *v4l2_norm_to_name(v4l2_std_id id) 96const char *v4l2_norm_to_name(v4l2_std_id id)
58{ 97{
59 char *name;
60 u32 myid = id; 98 u32 myid = id;
99 int i;
61 100
62 /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle 101 /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle
63 64 bit comparations. So, on that architecture, with some gcc 102 64 bit comparations. So, on that architecture, with some gcc
@@ -65,110 +104,17 @@ char *v4l2_norm_to_name(v4l2_std_id id)
65 */ 104 */
66 BUG_ON(myid != id); 105 BUG_ON(myid != id);
67 106
68 switch (myid) { 107 for (i = 0; standards[i].std; i++)
69 case V4L2_STD_PAL: 108 if (myid == standards[i].std)
70 name = "PAL"; 109 break;
71 break; 110 return standards[i].descr;
72 case V4L2_STD_PAL_BG:
73 name = "PAL-BG";
74 break;
75 case V4L2_STD_PAL_DK:
76 name = "PAL-DK";
77 break;
78 case V4L2_STD_PAL_B:
79 name = "PAL-B";
80 break;
81 case V4L2_STD_PAL_B1:
82 name = "PAL-B1";
83 break;
84 case V4L2_STD_PAL_G:
85 name = "PAL-G";
86 break;
87 case V4L2_STD_PAL_H:
88 name = "PAL-H";
89 break;
90 case V4L2_STD_PAL_I:
91 name = "PAL-I";
92 break;
93 case V4L2_STD_PAL_D:
94 name = "PAL-D";
95 break;
96 case V4L2_STD_PAL_D1:
97 name = "PAL-D1";
98 break;
99 case V4L2_STD_PAL_K:
100 name = "PAL-K";
101 break;
102 case V4L2_STD_PAL_M:
103 name = "PAL-M";
104 break;
105 case V4L2_STD_PAL_N:
106 name = "PAL-N";
107 break;
108 case V4L2_STD_PAL_Nc:
109 name = "PAL-Nc";
110 break;
111 case V4L2_STD_PAL_60:
112 name = "PAL-60";
113 break;
114 case V4L2_STD_NTSC:
115 name = "NTSC";
116 break;
117 case V4L2_STD_NTSC_M:
118 name = "NTSC-M";
119 break;
120 case V4L2_STD_NTSC_M_JP:
121 name = "NTSC-M-JP";
122 break;
123 case V4L2_STD_NTSC_443:
124 name = "NTSC-443";
125 break;
126 case V4L2_STD_NTSC_M_KR:
127 name = "NTSC-M-KR";
128 break;
129 case V4L2_STD_SECAM:
130 name = "SECAM";
131 break;
132 case V4L2_STD_SECAM_DK:
133 name = "SECAM-DK";
134 break;
135 case V4L2_STD_SECAM_B:
136 name = "SECAM-B";
137 break;
138 case V4L2_STD_SECAM_D:
139 name = "SECAM-D";
140 break;
141 case V4L2_STD_SECAM_G:
142 name = "SECAM-G";
143 break;
144 case V4L2_STD_SECAM_H:
145 name = "SECAM-H";
146 break;
147 case V4L2_STD_SECAM_K:
148 name = "SECAM-K";
149 break;
150 case V4L2_STD_SECAM_K1:
151 name = "SECAM-K1";
152 break;
153 case V4L2_STD_SECAM_L:
154 name = "SECAM-L";
155 break;
156 case V4L2_STD_SECAM_LC:
157 name = "SECAM-LC";
158 break;
159 default:
160 name = "Unknown";
161 break;
162 }
163
164 return name;
165} 111}
166EXPORT_SYMBOL(v4l2_norm_to_name); 112EXPORT_SYMBOL(v4l2_norm_to_name);
167 113
168/* Fill in the fields of a v4l2_standard structure according to the 114/* Fill in the fields of a v4l2_standard structure according to the
169 'id' and 'transmission' parameters. Returns negative on error. */ 115 'id' and 'transmission' parameters. Returns negative on error. */
170int v4l2_video_std_construct(struct v4l2_standard *vs, 116int v4l2_video_std_construct(struct v4l2_standard *vs,
171 int id, char *name) 117 int id, const char *name)
172{ 118{
173 u32 index = vs->index; 119 u32 index = vs->index;
174 120
@@ -1222,95 +1168,40 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
1222 case VIDIOC_ENUMSTD: 1168 case VIDIOC_ENUMSTD:
1223 { 1169 {
1224 struct v4l2_standard *p = arg; 1170 struct v4l2_standard *p = arg;
1225 v4l2_std_id id = vfd->tvnorms,curr_id=0; 1171 v4l2_std_id id = vfd->tvnorms, curr_id = 0;
1226 unsigned int index = p->index,i; 1172 unsigned int index = p->index, i, j = 0;
1227 1173 const char *descr = "";
1228 if (index<0) { 1174
1229 ret=-EINVAL; 1175 /* Return norm array in a canonical way */
1230 break; 1176 for (i = 0; i <= index && id; i++) {
1231 } 1177 /* last std value in the standards array is 0, so this
1232 1178 while always ends there since (id & 0) == 0. */
1233 /* Return norm array on a canonical way */ 1179 while ((id & standards[j].std) != standards[j].std)
1234 for (i=0;i<= index && id; i++) { 1180 j++;
1235 if ( (id & V4L2_STD_PAL) == V4L2_STD_PAL) { 1181 curr_id = standards[j].std;
1236 curr_id = V4L2_STD_PAL; 1182 descr = standards[j].descr;
1237 } else if ( (id & V4L2_STD_PAL_BG) == V4L2_STD_PAL_BG) { 1183 j++;
1238 curr_id = V4L2_STD_PAL_BG; 1184 if (curr_id == 0)
1239 } else if ( (id & V4L2_STD_PAL_DK) == V4L2_STD_PAL_DK) {
1240 curr_id = V4L2_STD_PAL_DK;
1241 } else if ( (id & V4L2_STD_PAL_B) == V4L2_STD_PAL_B) {
1242 curr_id = V4L2_STD_PAL_B;
1243 } else if ( (id & V4L2_STD_PAL_B1) == V4L2_STD_PAL_B1) {
1244 curr_id = V4L2_STD_PAL_B1;
1245 } else if ( (id & V4L2_STD_PAL_G) == V4L2_STD_PAL_G) {
1246 curr_id = V4L2_STD_PAL_G;
1247 } else if ( (id & V4L2_STD_PAL_H) == V4L2_STD_PAL_H) {
1248 curr_id = V4L2_STD_PAL_H;
1249 } else if ( (id & V4L2_STD_PAL_I) == V4L2_STD_PAL_I) {
1250 curr_id = V4L2_STD_PAL_I;
1251 } else if ( (id & V4L2_STD_PAL_D) == V4L2_STD_PAL_D) {
1252 curr_id = V4L2_STD_PAL_D;
1253 } else if ( (id & V4L2_STD_PAL_D1) == V4L2_STD_PAL_D1) {
1254 curr_id = V4L2_STD_PAL_D1;
1255 } else if ( (id & V4L2_STD_PAL_K) == V4L2_STD_PAL_K) {
1256 curr_id = V4L2_STD_PAL_K;
1257 } else if ( (id & V4L2_STD_PAL_M) == V4L2_STD_PAL_M) {
1258 curr_id = V4L2_STD_PAL_M;
1259 } else if ( (id & V4L2_STD_PAL_N) == V4L2_STD_PAL_N) {
1260 curr_id = V4L2_STD_PAL_N;
1261 } else if ( (id & V4L2_STD_PAL_Nc) == V4L2_STD_PAL_Nc) {
1262 curr_id = V4L2_STD_PAL_Nc;
1263 } else if ( (id & V4L2_STD_PAL_60) == V4L2_STD_PAL_60) {
1264 curr_id = V4L2_STD_PAL_60;
1265 } else if ( (id & V4L2_STD_NTSC) == V4L2_STD_NTSC) {
1266 curr_id = V4L2_STD_NTSC;
1267 } else if ( (id & V4L2_STD_NTSC_M) == V4L2_STD_NTSC_M) {
1268 curr_id = V4L2_STD_NTSC_M;
1269 } else if ( (id & V4L2_STD_NTSC_M_JP) == V4L2_STD_NTSC_M_JP) {
1270 curr_id = V4L2_STD_NTSC_M_JP;
1271 } else if ( (id & V4L2_STD_NTSC_443) == V4L2_STD_NTSC_443) {
1272 curr_id = V4L2_STD_NTSC_443;
1273 } else if ( (id & V4L2_STD_NTSC_M_KR) == V4L2_STD_NTSC_M_KR) {
1274 curr_id = V4L2_STD_NTSC_M_KR;
1275 } else if ( (id & V4L2_STD_SECAM) == V4L2_STD_SECAM) {
1276 curr_id = V4L2_STD_SECAM;
1277 } else if ( (id & V4L2_STD_SECAM_DK) == V4L2_STD_SECAM_DK) {
1278 curr_id = V4L2_STD_SECAM_DK;
1279 } else if ( (id & V4L2_STD_SECAM_B) == V4L2_STD_SECAM_B) {
1280 curr_id = V4L2_STD_SECAM_B;
1281 } else if ( (id & V4L2_STD_SECAM_D) == V4L2_STD_SECAM_D) {
1282 curr_id = V4L2_STD_SECAM_D;
1283 } else if ( (id & V4L2_STD_SECAM_G) == V4L2_STD_SECAM_G) {
1284 curr_id = V4L2_STD_SECAM_G;
1285 } else if ( (id & V4L2_STD_SECAM_H) == V4L2_STD_SECAM_H) {
1286 curr_id = V4L2_STD_SECAM_H;
1287 } else if ( (id & V4L2_STD_SECAM_K) == V4L2_STD_SECAM_K) {
1288 curr_id = V4L2_STD_SECAM_K;
1289 } else if ( (id & V4L2_STD_SECAM_K1) == V4L2_STD_SECAM_K1) {
1290 curr_id = V4L2_STD_SECAM_K1;
1291 } else if ( (id & V4L2_STD_SECAM_L) == V4L2_STD_SECAM_L) {
1292 curr_id = V4L2_STD_SECAM_L;
1293 } else if ( (id & V4L2_STD_SECAM_LC) == V4L2_STD_SECAM_LC) {
1294 curr_id = V4L2_STD_SECAM_LC;
1295 } else {
1296 break; 1185 break;
1297 } 1186 if (curr_id != V4L2_STD_PAL &&
1298 id &= ~curr_id; 1187 curr_id != V4L2_STD_SECAM &&
1188 curr_id != V4L2_STD_NTSC)
1189 id &= ~curr_id;
1299 } 1190 }
1300 if (i<=index) 1191 if (i <= index)
1301 return -EINVAL; 1192 return -EINVAL;
1302 1193
1303 v4l2_video_std_construct(p, curr_id,v4l2_norm_to_name(curr_id)); 1194 v4l2_video_std_construct(p, curr_id, descr);
1304 p->index = index; 1195 p->index = index;
1305 1196
1306 dbgarg (cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, " 1197 dbgarg(cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, "
1307 "framelines=%d\n", p->index, 1198 "framelines=%d\n", p->index,
1308 (unsigned long long)p->id, p->name, 1199 (unsigned long long)p->id, p->name,
1309 p->frameperiod.numerator, 1200 p->frameperiod.numerator,
1310 p->frameperiod.denominator, 1201 p->frameperiod.denominator,
1311 p->framelines); 1202 p->framelines);
1312 1203
1313 ret=0; 1204 ret = 0;
1314 break; 1205 break;
1315 } 1206 }
1316 case VIDIOC_G_STD: 1207 case VIDIOC_G_STD: