return 0;
}
+static int vidioc_g_parm(struct file *file, void *priv,
+ struct v4l2_streamparm *parms)
+{
+ struct ionvideo_dev *dev = video_drvdata(file);
+ struct v4l2_amlogic_parm *ap
+ = (struct v4l2_amlogic_parm *)&parms->parm.capture;
+
+ if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ return -EINVAL;
+
+ memset(ap, 0, sizeof(struct v4l2_amlogic_parm));
+ *ap = dev->am_parm;
+
+ return 0;
+}
+
static const struct ionvideo_fmt *__get_format(u32 pixelformat)
{
const struct ionvideo_fmt *fmt;
dev->wait_ge2d_timeout = false;
videoc_omx_compute_pts(dev, vf);
buf->timecode.frames = 0;
+ dev->am_parm.signal_type = vf->signal_type;
+ dev->am_parm.master_display_colour
+ = vf->prop.master_display_colour;
vf_put(vf, dev->vf_receiver_name);
buf->timestamp.tv_sec = dev->pts >> 32;
buf->timestamp.tv_usec = dev->pts & 0xFFFFFFFF;
.vidioc_streamon = vidioc_streamon,
.vidioc_streamoff = vidioc_streamoff,
.vidioc_s_ctrl = vidioc_s_ctrl,
+ .vidioc_g_parm = vidioc_g_parm,
};
static const struct video_device ionvideo_template = {
#define PPMGR2_CANVAS_INDEX_SRC (PPMGR2_CANVAS_INDEX + 3)
+/* v4l2_amlogic_parm must < u8[200] */
+struct v4l2_amlogic_parm {
+ u32 signal_type;
+ struct vframe_master_display_colour_s
+ master_display_colour;
+ };
+
struct v4l2q_s {
int rp;
int wp;
struct mutex mutex_output;
struct v4l2_buffer ionvideo_input[IONVIDEO_POOL_SIZE + 1];
bool wait_ge2d_timeout;
+ struct v4l2_amlogic_parm am_parm;
};
unsigned int get_ionvideo_debug(void);
* Videobuf operations
* ------------------------------------------------------------------
*/
+
+static int vidioc_g_parm(struct file *file, void *priv,
+ struct v4l2_streamparm *parms)
+{
+ struct vivi_dev *dev = video_drvdata(file);
+ struct v4l2_amlogic_parm *ap
+ = (struct v4l2_amlogic_parm *)&parms->parm.capture;
+
+ if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ return -EINVAL;
+
+ memset(ap, 0, sizeof(struct v4l2_amlogic_parm));
+ *ap = dev->am_parm;
+
+ return 0;
+}
+
static int buffer_setup(struct videobuf_queue *vq, unsigned int *count,
unsigned int *size)
{
return -EAGAIN;
}
dev->vf->omx_index = dev->frame_num;
+ dev->am_parm.signal_type = dev->vf->signal_type;
+ dev->am_parm.master_display_colour
+ = dev->vf->prop.master_display_colour;
if (dev->vf->pts_us64) {
dev->first_frame = 1;
#ifdef CONFIG_VIDEO_V4L1_COMPAT
.vidiocgmbuf = vidiocgmbuf,
#endif
+ .vidioc_g_parm = vidioc_g_parm,
+
};
static struct video_device amlvideo_template = {
#ifndef AMLVIDEO_H_
#define AMLVIDEO_H_
+#include <linux/amlogic/media/vfm/vframe.h>
#define AMLVIDEO_POOL_SIZE 16
+/* v4l2_amlogic_parm must < u8[200] */
+struct v4l2_amlogic_parm {
+ u32 signal_type;
+ struct vframe_master_display_colour_s
+ master_display_colour;
+ };
+
struct vivi_fmt {
char *name;
u32 fourcc; /* v4l2 format id */
struct vframe_provider_s video_vf_prov;
struct vframe_receiver_s video_vf_recv;
u32 frame_num;
+ struct v4l2_amlogic_parm am_parm;
};
struct vivi_fh {