/* This can be moved to graphic layer's callback function */ static void mxr_set_layer_src_fmt(struct sub_mxr_device *sub_mxr, u32 pad) { /* sink pad number and array index of layer are same */ struct mxr_layer *layer = sub_mxr->layer[pad]; struct v4l2_mbus_framefmt *fmt = &sub_mxr->mbus_fmt[pad]; u32 fourcc; switch (fmt->code) { case V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE: case V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE: fourcc = V4L2_PIX_FMT_RGB444; break; case V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE: case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE: fourcc = V4L2_PIX_FMT_RGB555; break; case V4L2_MBUS_FMT_RGB565_2X8_BE: case V4L2_MBUS_FMT_RGB565_2X8_LE: fourcc = V4L2_PIX_FMT_RGB565; break; case V4L2_MBUS_FMT_XRGB8888_4X8_LE: fourcc = V4L2_PIX_FMT_BGR32; break; } /* This will be applied to hardware right after streamon */ layer->fmt = find_format_by_fourcc(layer, fourcc); }
static int mxr_s_fmt(struct file *file, void *priv, struct v4l2_format *f) { struct mxr_layer *layer = video_drvdata(file); const struct mxr_format *fmt; struct v4l2_pix_format_mplane *pix; struct mxr_device *mdev = layer->mdev; struct mxr_geometry *geo = &layer->geo; mxr_dbg(mdev, "%s:%d\n", __func__, __LINE__); pix = &f->fmt.pix_mp; fmt = find_format_by_fourcc(layer, pix->pixelformat); if (fmt == NULL) { mxr_warn(mdev, "not recognized fourcc: %08x\n", pix->pixelformat); return -EINVAL; } layer->fmt = fmt; geo->src.full_width = pix->width; geo->src.width = pix->width; geo->src.full_height = pix->height; geo->src.height = pix->height; /* assure consistency of geometry */ mxr_layer_geo_fix(layer); mxr_dbg(mdev, "width=%u height=%u span=%u\n", geo->src.width, geo->src.height, geo->src.full_width); return 0; }