conststruct rvin_video_format *rvin_format_from_pixel(struct rvin_dev *vin,
u32 pixelformat)
{ int i;
switch (pixelformat) { case V4L2_PIX_FMT_XBGR32: if (vin->info->model == RCAR_M1) return NULL; break; case V4L2_PIX_FMT_NV12: /* * If NV12 is supported it's only supported on channels 0, 1, 4, * 5, 8, 9, 12 and 13.
*/ if (!vin->info->nv12 || !(BIT(vin->id) & 0x3333)) return NULL; break; case V4L2_PIX_FMT_SBGGR10: case V4L2_PIX_FMT_SGBRG10: case V4L2_PIX_FMT_SGRBG10: case V4L2_PIX_FMT_SRGGB10: if (!vin->info->raw10) return NULL; break; default: break;
}
for (i = 0; i < ARRAY_SIZE(rvin_formats); i++) if (rvin_formats[i].fourcc == pixelformat) return rvin_formats + i;
if (!rvin_format_from_pixel(vin, pix->pixelformat))
pix->pixelformat = RVIN_DEFAULT_FORMAT;
switch (pix->field) { case V4L2_FIELD_TOP: case V4L2_FIELD_BOTTOM: case V4L2_FIELD_NONE: case V4L2_FIELD_INTERLACED_TB: case V4L2_FIELD_INTERLACED_BT: case V4L2_FIELD_INTERLACED: case V4L2_FIELD_ALTERNATE: break; default:
pix->field = RVIN_DEFAULT_FIELD; break;
}
/* Hardware limits width alignment based on format. */ switch (pix->pixelformat) { /* Multiple of 32 (2^5) for NV12/16. */ case V4L2_PIX_FMT_NV12: case V4L2_PIX_FMT_NV16:
walign = 5; break; /* Multiple of 2 (2^1) for YUV. */ case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_UYVY:
walign = 1; break; /* No multiple for RGB. */ default:
walign = 0; break;
}
/* * If mbus_code is set only enumerate supported pixel formats for that * bus code. Converting from YCbCr to RGB and RGB to YCbCr is possible * with VIN, so all supported YCbCr and RGB media bus codes can produce * all of the related pixel formats. If mbus_code is not set enumerate * all possible pixelformats. * * TODO: Once raw MEDIA_BUS_FMT_SRGGB12_1X12 format is added to the * driver this needs to be extended so raw media bus code only result in * raw pixel format.
*/ switch (f->mbus_code) { case 0: case MEDIA_BUS_FMT_YUYV8_1X16: case MEDIA_BUS_FMT_UYVY8_1X16: case MEDIA_BUS_FMT_UYVY8_2X8: case MEDIA_BUS_FMT_UYVY10_2X10: case MEDIA_BUS_FMT_RGB888_1X24: break; case MEDIA_BUS_FMT_SBGGR8_1X8: if (f->index) return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_SBGGR8; return 0; case MEDIA_BUS_FMT_SGBRG8_1X8: if (f->index) return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_SGBRG8; return 0; case MEDIA_BUS_FMT_SGRBG8_1X8: if (f->index) return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_SGRBG8; return 0; case MEDIA_BUS_FMT_SRGGB8_1X8: if (f->index) return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_SRGGB8; return 0; case MEDIA_BUS_FMT_SBGGR10_1X10: if (f->index) return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_SBGGR10; return 0; case MEDIA_BUS_FMT_SGBRG10_1X10: if (f->index) return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_SGBRG10; return 0; case MEDIA_BUS_FMT_SGRBG10_1X10: if (f->index) return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_SGRBG10; return 0; case MEDIA_BUS_FMT_SRGGB10_1X10: if (f->index) return -EINVAL;
f->pixelformat = V4L2_PIX_FMT_SRGGB10; return 0; default: return -EINVAL;
}
matched = -1; for (i = 0; i < ARRAY_SIZE(rvin_formats); i++) { if (rvin_format_from_pixel(vin, rvin_formats[i].fourcc))
matched++;
if (fmt.format.field == V4L2_FIELD_ALTERNATE) { switch (vin->format.field) { case V4L2_FIELD_INTERLACED_TB: case V4L2_FIELD_INTERLACED_BT: case V4L2_FIELD_INTERLACED:
rect->height *= 2; break;
}
}
vin_dbg(vin, "Cropped (%d,%d)/%ux%u of %dx%d\n",
r.left, r.top, r.width, r.height,
max_rect.width, max_rect.height); break; case V4L2_SEL_TGT_COMPOSE: /* Make sure compose rect fits inside output format */
max_rect.top = max_rect.left = 0;
max_rect.width = vin->format.width;
max_rect.height = vin->format.height;
v4l2_rect_map_inside(&r, &max_rect);
/* * Composing is done by adding a offset to the buffer address, * the HW wants this address to be aligned to HW_BUFFER_MASK. * Make sure the top and left values meets this requirement.
*/ while ((r.top * vin->format.bytesperline) & HW_BUFFER_MASK)
r.top--;
staticvoid rvin_mc_try_format(struct rvin_dev *vin, struct v4l2_pix_format *pix)
{ /* * The V4L2 specification clearly documents the colorspace fields * as being set by drivers for capture devices. Using the values * supplied by userspace thus wouldn't comply with the API. Until * the API is updated force fixed values.
*/
pix->colorspace = RVIN_DEFAULT_COLORSPACE;
pix->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(pix->colorspace);
pix->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(pix->colorspace);
pix->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true, pix->colorspace,
pix->ycbcr_enc);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.