diff options
Diffstat (limited to 'drivers/media/video/vivi.c')
| -rw-r--r-- | drivers/media/video/vivi.c | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c index cd7266858462..7705fc6baf00 100644 --- a/drivers/media/video/vivi.c +++ b/drivers/media/video/vivi.c | |||
| @@ -343,6 +343,53 @@ static struct bar_std bars[] = { | |||
| 343 | #define TO_U(r, g, b) \ | 343 | #define TO_U(r, g, b) \ |
| 344 | (((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128) | 344 | (((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128) |
| 345 | 345 | ||
| 346 | /* precalculate color bar values to speed up rendering */ | ||
| 347 | static void precalculate_bars(struct vivi_fh *fh) | ||
| 348 | { | ||
| 349 | struct vivi_dev *dev = fh->dev; | ||
| 350 | unsigned char r, g, b; | ||
| 351 | int k, is_yuv; | ||
| 352 | |||
| 353 | fh->input = dev->input; | ||
| 354 | |||
| 355 | for (k = 0; k < 8; k++) { | ||
| 356 | r = bars[fh->input].bar[k][0]; | ||
| 357 | g = bars[fh->input].bar[k][1]; | ||
| 358 | b = bars[fh->input].bar[k][2]; | ||
| 359 | is_yuv = 0; | ||
| 360 | |||
| 361 | switch (fh->fmt->fourcc) { | ||
| 362 | case V4L2_PIX_FMT_YUYV: | ||
| 363 | case V4L2_PIX_FMT_UYVY: | ||
| 364 | is_yuv = 1; | ||
| 365 | break; | ||
| 366 | case V4L2_PIX_FMT_RGB565: | ||
| 367 | case V4L2_PIX_FMT_RGB565X: | ||
| 368 | r >>= 3; | ||
| 369 | g >>= 2; | ||
| 370 | b >>= 3; | ||
| 371 | break; | ||
| 372 | case V4L2_PIX_FMT_RGB555: | ||
| 373 | case V4L2_PIX_FMT_RGB555X: | ||
| 374 | r >>= 3; | ||
| 375 | g >>= 3; | ||
| 376 | b >>= 3; | ||
| 377 | break; | ||
| 378 | } | ||
| 379 | |||
| 380 | if (is_yuv) { | ||
| 381 | fh->bars[k][0] = TO_Y(r, g, b); /* Luma */ | ||
| 382 | fh->bars[k][1] = TO_U(r, g, b); /* Cb */ | ||
| 383 | fh->bars[k][2] = TO_V(r, g, b); /* Cr */ | ||
| 384 | } else { | ||
| 385 | fh->bars[k][0] = r; | ||
| 386 | fh->bars[k][1] = g; | ||
| 387 | fh->bars[k][2] = b; | ||
| 388 | } | ||
| 389 | } | ||
| 390 | |||
| 391 | } | ||
| 392 | |||
| 346 | #define TSTAMP_MIN_Y 24 | 393 | #define TSTAMP_MIN_Y 24 |
| 347 | #define TSTAMP_MAX_Y (TSTAMP_MIN_Y + 15) | 394 | #define TSTAMP_MAX_Y (TSTAMP_MIN_Y + 15) |
| 348 | #define TSTAMP_INPUT_X 10 | 395 | #define TSTAMP_INPUT_X 10 |
| @@ -755,6 +802,8 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb, | |||
| 755 | buf->vb.height = fh->height; | 802 | buf->vb.height = fh->height; |
| 756 | buf->vb.field = field; | 803 | buf->vb.field = field; |
| 757 | 804 | ||
| 805 | precalculate_bars(fh); | ||
| 806 | |||
| 758 | if (VIDEOBUF_NEEDS_INIT == buf->vb.state) { | 807 | if (VIDEOBUF_NEEDS_INIT == buf->vb.state) { |
| 759 | rc = videobuf_iolock(vq, &buf->vb, NULL); | 808 | rc = videobuf_iolock(vq, &buf->vb, NULL); |
| 760 | if (rc < 0) | 809 | if (rc < 0) |
| @@ -893,53 +942,6 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, | |||
| 893 | return 0; | 942 | return 0; |
| 894 | } | 943 | } |
| 895 | 944 | ||
| 896 | /* precalculate color bar values to speed up rendering */ | ||
| 897 | static void precalculate_bars(struct vivi_fh *fh) | ||
| 898 | { | ||
| 899 | struct vivi_dev *dev = fh->dev; | ||
| 900 | unsigned char r, g, b; | ||
| 901 | int k, is_yuv; | ||
| 902 | |||
| 903 | fh->input = dev->input; | ||
| 904 | |||
| 905 | for (k = 0; k < 8; k++) { | ||
| 906 | r = bars[fh->input].bar[k][0]; | ||
| 907 | g = bars[fh->input].bar[k][1]; | ||
| 908 | b = bars[fh->input].bar[k][2]; | ||
| 909 | is_yuv = 0; | ||
| 910 | |||
| 911 | switch (fh->fmt->fourcc) { | ||
| 912 | case V4L2_PIX_FMT_YUYV: | ||
| 913 | case V4L2_PIX_FMT_UYVY: | ||
| 914 | is_yuv = 1; | ||
| 915 | break; | ||
| 916 | case V4L2_PIX_FMT_RGB565: | ||
| 917 | case V4L2_PIX_FMT_RGB565X: | ||
| 918 | r >>= 3; | ||
| 919 | g >>= 2; | ||
| 920 | b >>= 3; | ||
| 921 | break; | ||
| 922 | case V4L2_PIX_FMT_RGB555: | ||
| 923 | case V4L2_PIX_FMT_RGB555X: | ||
| 924 | r >>= 3; | ||
| 925 | g >>= 3; | ||
| 926 | b >>= 3; | ||
| 927 | break; | ||
| 928 | } | ||
| 929 | |||
| 930 | if (is_yuv) { | ||
| 931 | fh->bars[k][0] = TO_Y(r, g, b); /* Luma */ | ||
| 932 | fh->bars[k][1] = TO_U(r, g, b); /* Cb */ | ||
| 933 | fh->bars[k][2] = TO_V(r, g, b); /* Cr */ | ||
| 934 | } else { | ||
| 935 | fh->bars[k][0] = r; | ||
| 936 | fh->bars[k][1] = g; | ||
| 937 | fh->bars[k][2] = b; | ||
| 938 | } | ||
| 939 | } | ||
| 940 | |||
| 941 | } | ||
| 942 | |||
| 943 | /*FIXME: This seems to be generic enough to be at videodev2 */ | 945 | /*FIXME: This seems to be generic enough to be at videodev2 */ |
| 944 | static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, | 946 | static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, |
| 945 | struct v4l2_format *f) | 947 | struct v4l2_format *f) |
| @@ -965,8 +967,6 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, | |||
| 965 | fh->vb_vidq.field = f->fmt.pix.field; | 967 | fh->vb_vidq.field = f->fmt.pix.field; |
| 966 | fh->type = f->type; | 968 | fh->type = f->type; |
| 967 | 969 | ||
| 968 | precalculate_bars(fh); | ||
| 969 | |||
| 970 | ret = 0; | 970 | ret = 0; |
| 971 | out: | 971 | out: |
| 972 | mutex_unlock(&q->vb_lock); | 972 | mutex_unlock(&q->vb_lock); |
| @@ -1357,6 +1357,7 @@ static int __init vivi_create_instance(int inst) | |||
| 1357 | goto unreg_dev; | 1357 | goto unreg_dev; |
| 1358 | 1358 | ||
| 1359 | *vfd = vivi_template; | 1359 | *vfd = vivi_template; |
| 1360 | vfd->debug = debug; | ||
| 1360 | 1361 | ||
| 1361 | ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr); | 1362 | ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr); |
| 1362 | if (ret < 0) | 1363 | if (ret < 0) |
