170
169
#define PALETTE(x) ((x < sizeof(device_palette2name)/sizeof(char*)) ? device_palette2name[x] : "UNKNOWN")
171
static const struct {
178
} supported_norms[]={
179
{"pal", TV_NORM_PAL, VIDEO_TUNER_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, PAL_FPS },
180
{"ntsc", TV_NORM_NTSC, VIDEO_TUNER_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, NTSC_FPS},
181
{"secam", TV_NORM_SECAM, VIDEO_TUNER_SECAM, VIDEO_MODE_SECAM,VIDEO_MODE_SECAM,PAL_FPS },
182
{"palnc", TV_NORM_PALNC, VIDEO_TUNER_PAL, VIDEO_MODE_PAL, 3, PAL_FPS },
183
{"palm", TV_NORM_PALM, VIDEO_TUNER_NTSC, VIDEO_MODE_NTSC, 4, NTSC_FPS},
184
{"paln", TV_NORM_PALN, VIDEO_TUNER_PAL, VIDEO_MODE_PAL, 5, PAL_FPS },
185
{"ntscjp",TV_NORM_NTSCJP, VIDEO_TUNER_NTSC, VIDEO_MODE_NTSC, 6, NTSC_FPS},
186
{"auto", -1, -1, -1, VIDEO_MODE_AUTO, -1 },
187
{NULL, -1, -1, -1, -1 }
172
190
static const char *norm2name(int mode)
177
case VIDEO_MODE_SECAM:
179
case VIDEO_MODE_NTSC:
181
case VIDEO_MODE_AUTO:
193
for(i=0;supported_norms[i].name; i++)
194
if(supported_norms[i].input_norm==mode)
195
return supported_norms[i].name;
188
199
static const char *audio_mode2name(int mode)
241
252
case IMGFMT_BGR15:
242
return(VIDEO_PALETTE_RGB555);
253
return VIDEO_PALETTE_RGB555;
243
254
case IMGFMT_BGR16:
244
return(VIDEO_PALETTE_RGB565);
255
return VIDEO_PALETTE_RGB565;
245
256
case IMGFMT_BGR24:
246
return(VIDEO_PALETTE_RGB24);
257
return VIDEO_PALETTE_RGB24;
247
258
case IMGFMT_BGR32:
248
return(VIDEO_PALETTE_RGB32);
259
return VIDEO_PALETTE_RGB32;
249
260
case IMGFMT_YV12:
250
261
case IMGFMT_I420:
251
return(VIDEO_PALETTE_YUV420P);
262
return VIDEO_PALETTE_YUV420P;
252
263
case IMGFMT_YUY2:
253
return(VIDEO_PALETTE_YUV422);
264
return VIDEO_PALETTE_YUV422;
254
265
case IMGFMT_UYVY:
255
return(VIDEO_PALETTE_UYVY);
266
return VIDEO_PALETTE_UYVY;
260
271
// sets and sanitizes audio buffer/block sizes
1129
1144
case TVI_CONTROL_IS_VIDEO:
1131
1146
if (priv->capability.type & VID_TYPE_CAPTURE)
1132
return(TVI_CONTROL_TRUE);
1133
return(TVI_CONTROL_FALSE);
1147
return TVI_CONTROL_TRUE;
1148
return TVI_CONTROL_FALSE;
1135
1150
case TVI_CONTROL_IS_AUDIO:
1136
if (priv->tv_param->force_audio) return(TVI_CONTROL_TRUE);
1151
if (priv->tv_param->force_audio) return TVI_CONTROL_TRUE;
1137
1152
if (priv->channels[priv->act_channel].flags & VIDEO_VC_AUDIO)
1139
return(TVI_CONTROL_TRUE);
1154
return TVI_CONTROL_TRUE;
1141
return(TVI_CONTROL_FALSE);
1156
return TVI_CONTROL_FALSE;
1142
1157
case TVI_CONTROL_IS_TUNER:
1144
1159
// if (priv->capability.type & VID_TYPE_TUNER)
1145
1160
if (priv->channels[priv->act_channel].flags & VIDEO_VC_TUNER)
1146
return(TVI_CONTROL_TRUE);
1147
return(TVI_CONTROL_FALSE);
1161
return TVI_CONTROL_TRUE;
1162
return TVI_CONTROL_FALSE;
1150
1165
/* ========== VIDEO controls =========== */
1195
1210
mp_msg(MSGT_TV, MSGL_V, "Requested width: %d\n", req_width);
1196
1211
if ((req_width >= priv->capability.minwidth) &&
1197
1212
(req_width <= priv->capability.maxwidth))
1198
return(TVI_CONTROL_TRUE);
1199
return(TVI_CONTROL_FALSE);
1213
return TVI_CONTROL_TRUE;
1214
return TVI_CONTROL_FALSE;
1201
1216
case TVI_CONTROL_VID_SET_WIDTH:
1202
1217
priv->width = *(int *)arg;
1203
return(TVI_CONTROL_TRUE);
1218
return TVI_CONTROL_TRUE;
1204
1219
case TVI_CONTROL_VID_GET_HEIGHT:
1205
1220
*(int *)arg = priv->height;
1206
return(TVI_CONTROL_TRUE);
1221
return TVI_CONTROL_TRUE;
1207
1222
case TVI_CONTROL_VID_CHK_HEIGHT:
1209
1224
int req_height = *(int *)arg;
1211
1226
mp_msg(MSGT_TV, MSGL_V, "Requested height: %d\n", req_height);
1212
1227
if ((req_height >= priv->capability.minheight) &&
1213
1228
(req_height <= priv->capability.maxheight))
1214
return(TVI_CONTROL_TRUE);
1215
return(TVI_CONTROL_FALSE);
1229
return TVI_CONTROL_TRUE;
1230
return TVI_CONTROL_FALSE;
1217
1232
case TVI_CONTROL_VID_SET_HEIGHT:
1218
1233
priv->height = *(int *)arg;
1219
return(TVI_CONTROL_TRUE);
1234
return TVI_CONTROL_TRUE;
1220
1235
case TVI_CONTROL_VID_GET_PICTURE:
1221
1236
if (ioctl(priv->video_fd, VIDIOCGPICT, &priv->picture) == -1)
1223
1238
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno));
1224
return(TVI_CONTROL_FALSE);
1239
return TVI_CONTROL_FALSE;
1226
return(TVI_CONTROL_TRUE);
1241
return TVI_CONTROL_TRUE;
1227
1242
case TVI_CONTROL_VID_SET_PICTURE:
1228
1243
if (ioctl(priv->video_fd, VIDIOCSPICT, &priv->picture) == -1)
1230
1245
mp_msg(MSGT_TV, MSGL_ERR, "ioctl set picture failed: %s\n", strerror(errno));
1231
return(TVI_CONTROL_FALSE);
1246
return TVI_CONTROL_FALSE;
1233
return(TVI_CONTROL_TRUE);
1248
return TVI_CONTROL_TRUE;
1234
1249
case TVI_CONTROL_VID_SET_BRIGHTNESS:
1235
1250
priv->picture.brightness = (327*(*(int *)arg+100)) + 68;
1236
1251
return control(priv, TVI_CONTROL_VID_SET_PICTURE, 0);
1308
1323
ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]);
1311
return(TVI_CONTROL_TRUE);
1326
return TVI_CONTROL_TRUE;
1313
1328
case TVI_CONTROL_TUN_GET_TUNER:
1315
1330
if (ioctl(priv->video_fd, VIDIOCGTUNER, &priv->tuner) == -1)
1317
1332
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get tuner failed: %s\n", strerror(errno));
1318
return(TVI_CONTROL_FALSE);
1333
return TVI_CONTROL_FALSE;
1321
1336
mp_msg(MSGT_TV, MSGL_V, "Tuner (%s) range: %lu -> %lu\n", priv->tuner.name,
1322
1337
priv->tuner.rangelow, priv->tuner.rangehigh);
1323
return(TVI_CONTROL_TRUE);
1338
return TVI_CONTROL_TRUE;
1325
1340
case TVI_CONTROL_TUN_SET_TUNER:
1327
1342
if (ioctl(priv->video_fd, VIDIOCSTUNER, &priv->tuner) == -1)
1329
1344
mp_msg(MSGT_TV, MSGL_ERR, "ioctl set tuner failed: %s\n", strerror(errno));
1330
return(TVI_CONTROL_FALSE);
1345
return TVI_CONTROL_FALSE;
1332
return(TVI_CONTROL_TRUE);
1347
return TVI_CONTROL_TRUE;
1334
1349
case TVI_CONTROL_TUN_SET_NORM:
1336
1351
int req_mode = *(int *)arg;
1353
for(norm_index=0;supported_norms[norm_index].name; norm_index++)
1354
if(req_mode==supported_norms[norm_index].normid)
1338
if ((req_mode != TV_NORM_PAL) && (req_mode != TV_NORM_NTSC) && (req_mode != TV_NORM_SECAM)
1339
&& (req_mode != TV_NORM_PALNC) && (req_mode != TV_NORM_PALM) && (req_mode != TV_NORM_PALN)
1340
&& (req_mode != TV_NORM_NTSCJP)) {
1357
if(!supported_norms[norm_index].name) {
1341
1358
mp_msg(MSGT_TV, MSGL_ERR, "Unknown norm!\n");
1342
return(TVI_CONTROL_FALSE);
1359
return TVI_CONTROL_FALSE;
1345
1362
if (priv->channels[priv->act_channel].flags & VIDEO_VC_TUNER) {
1348
1365
control(priv, TVI_CONTROL_TUN_GET_TUNER, 0);
1349
if (((req_mode == TV_NORM_PAL
1350
|| req_mode == TV_NORM_PALNC
1351
|| req_mode == TV_NORM_PALN) && !(priv->tuner.flags & VIDEO_TUNER_PAL)) ||
1352
((req_mode == TV_NORM_NTSC
1353
|| req_mode == TV_NORM_NTSCJP
1354
|| req_mode == TV_NORM_PALM) && !(priv->tuner.flags & VIDEO_TUNER_NTSC)) ||
1355
((req_mode == TV_NORM_SECAM) && !(priv->tuner.flags & VIDEO_TUNER_SECAM)))
1366
if(!(priv->tuner.flags & supported_norms[norm_index].tuner_flags))
1357
1368
mp_msg(MSGT_TV, MSGL_ERR, "Tuner isn't capable to set norm!\n");
1358
return(TVI_CONTROL_FALSE);
1369
return TVI_CONTROL_FALSE;
1361
1372
prev_mode = priv->tuner.mode;
1367
priv->tuner.mode = VIDEO_MODE_PAL;
1370
case TV_NORM_NTSCJP:
1372
priv->tuner.mode = VIDEO_MODE_NTSC;
1375
priv->tuner.mode = VIDEO_MODE_SECAM;
1374
priv->tuner.mode = supported_norms[norm_index].tuner_mode;
1379
1376
if (control(priv, TVI_CONTROL_TUN_SET_TUNER, &priv->tuner) != TVI_CONTROL_TRUE) {
1380
1377
// norm setting failed, but maybe it's only because it's fixed
1381
if (priv->tuner.mode != prev_mode) return(TVI_CONTROL_FALSE); // no it really failed
1378
if (priv->tuner.mode != prev_mode) return TVI_CONTROL_FALSE; // no it really failed
1388
priv->channels[priv->act_channel].norm = VIDEO_MODE_PAL;
1391
priv->channels[priv->act_channel].norm = VIDEO_MODE_NTSC;
1394
priv->channels[priv->act_channel].norm = VIDEO_MODE_SECAM;
1397
priv->channels[priv->act_channel].norm = 3;
1400
priv->channels[priv->act_channel].norm = 4;
1403
priv->channels[priv->act_channel].norm = 5;
1405
case TV_NORM_NTSCJP:
1406
priv->channels[priv->act_channel].norm = 6;
1383
priv->channels[priv->act_channel].norm = supported_norms[norm_index].input_norm;
1409
1385
if (ioctl(priv->video_fd, VIDIOCSCHAN, &priv->channels[priv->act_channel]) == -1)
1411
1387
mp_msg(MSGT_TV, MSGL_ERR, "ioctl set chan failed: %s\n", strerror(errno));
1412
return(TVI_CONTROL_FALSE);
1388
return TVI_CONTROL_FALSE;
1415
1391
if (ioctl(priv->video_fd, VIDIOCGCAP, &priv->capability) == -1) {
1416
1392
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get capabilites failed: %s\n", strerror(errno));
1417
return(TVI_CONTROL_FALSE);
1420
if(req_mode == TV_NORM_PAL || req_mode == TV_NORM_SECAM || req_mode == TV_NORM_PALN || req_mode == TV_NORM_PALNC) {
1421
priv->fps = PAL_FPS;
1424
if(req_mode == TV_NORM_NTSC || req_mode == TV_NORM_NTSCJP || req_mode == TV_NORM_PALM) {
1425
priv->fps = NTSC_FPS;
1393
return TVI_CONTROL_FALSE;
1396
priv->fps = supported_norms[norm_index].fps;
1428
1398
if(priv->height > priv->capability.maxheight) {
1429
1399
priv->height = priv->capability.maxheight;
1433
1403
priv->width = priv->capability.maxwidth;
1436
return(TVI_CONTROL_TRUE);
1406
return TVI_CONTROL_TRUE;
1438
1408
case TVI_CONTROL_TUN_GET_NORM:
1440
1410
*(int *)arg = priv->tuner.mode;
1442
return(TVI_CONTROL_TRUE);
1412
return TVI_CONTROL_TRUE;
1444
1414
case TVI_CONTROL_TUN_GET_SIGNAL:
1446
1416
if (ioctl(priv->video_fd, VIDIOCGTUNER, &priv->tuner) == -1)
1448
1418
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get tuner failed: %s\n", strerror(errno));
1449
return(TVI_CONTROL_FALSE);
1419
return TVI_CONTROL_FALSE;
1451
1421
*(int*)arg=100*(priv->tuner.signal>>8)/255;
1452
return(TVI_CONTROL_TRUE);
1422
return TVI_CONTROL_TRUE;
1455
1425
/* ========== AUDIO controls =========== */
1456
1426
case TVI_CONTROL_AUD_GET_FORMAT:
1458
1428
*(int *)arg = AF_FORMAT_S16_LE;
1459
return(TVI_CONTROL_TRUE);
1429
return TVI_CONTROL_TRUE;
1461
1431
case TVI_CONTROL_AUD_GET_CHANNELS:
1463
1433
*(int *)arg = priv->audio_in.channels;
1464
return(TVI_CONTROL_TRUE);
1434
return TVI_CONTROL_TRUE;
1466
1436
case TVI_CONTROL_AUD_GET_SAMPLERATE:
1468
1438
*(int *)arg = priv->audio_in.samplerate;
1469
return(TVI_CONTROL_TRUE);
1439
return TVI_CONTROL_TRUE;
1471
1441
case TVI_CONTROL_AUD_GET_SAMPLESIZE:
1473
1443
*(int *)arg = priv->audio_in.bytes_per_sample;
1474
return(TVI_CONTROL_TRUE);
1444
return TVI_CONTROL_TRUE;
1476
1446
case TVI_CONTROL_AUD_SET_SAMPLERATE:
1478
1448
if (audio_in_set_samplerate(&priv->audio_in, *(int *)arg) < 0) return TVI_CONTROL_FALSE;
1479
1449
setup_audio_buffer_sizes(priv);
1480
return(TVI_CONTROL_TRUE);
1450
return TVI_CONTROL_TRUE;
1482
1452
/* ========== SPECIFIC controls =========== */
1483
1453
case TVI_CONTROL_SPC_GET_INPUT: