Commit 7aea2c0b authored by Michael Tretter's avatar Michael Tretter Committed by Mauro Carvalho Chehab

media: allegro: add control to disable encoder buffer

The encoder buffer can have a negative impact on the quality of the
encoded video.

Add a control to allow user space to disable the encoder buffer per
channel if the VCU supports the encoder buffer but the quality is not
sufficient.
Signed-off-by: default avatarMichael Tretter <m.tretter@pengutronix.de>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 98f1cbf6
...@@ -105,6 +105,12 @@ ...@@ -105,6 +105,12 @@
#define BETA_OFFSET_DIV_2 -1 #define BETA_OFFSET_DIV_2 -1
#define TC_OFFSET_DIV_2 -1 #define TC_OFFSET_DIV_2 -1
/*
* This control allows applications to explicitly disable the encoder buffer.
* This value is Allegro specific.
*/
#define V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER (V4L2_CID_USER_ALLEGRO_BASE + 0)
static int debug; static int debug;
module_param(debug, int, 0644); module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Debug level (0-2)"); MODULE_PARM_DESC(debug, "Debug level (0-2)");
...@@ -275,6 +281,8 @@ struct allegro_channel { ...@@ -275,6 +281,8 @@ struct allegro_channel {
struct v4l2_ctrl *mpeg_video_cpb_size; struct v4l2_ctrl *mpeg_video_cpb_size;
struct v4l2_ctrl *mpeg_video_gop_size; struct v4l2_ctrl *mpeg_video_gop_size;
struct v4l2_ctrl *encoder_buffer;
/* user_id is used to identify the channel during CREATE_CHANNEL */ /* user_id is used to identify the channel during CREATE_CHANNEL */
/* not sure, what to set here and if this is actually required */ /* not sure, what to set here and if this is actually required */
int user_id; int user_id;
...@@ -1255,7 +1263,7 @@ static int fill_create_channel_param(struct allegro_channel *channel, ...@@ -1255,7 +1263,7 @@ static int fill_create_channel_param(struct allegro_channel *channel,
param->max_transfo_depth_intra = channel->max_transfo_depth_intra; param->max_transfo_depth_intra = channel->max_transfo_depth_intra;
param->max_transfo_depth_inter = channel->max_transfo_depth_inter; param->max_transfo_depth_inter = channel->max_transfo_depth_inter;
param->encoder_buffer_enabled = channel->dev->has_encoder_buffer; param->encoder_buffer_enabled = v4l2_ctrl_g_ctrl(channel->encoder_buffer);
param->encoder_buffer_offset = 0; param->encoder_buffer_offset = 0;
param->rate_control_mode = channel->frame_rc_enable ? param->rate_control_mode = channel->frame_rc_enable ?
...@@ -1381,7 +1389,7 @@ static int allegro_mcu_send_encode_frame(struct allegro_dev *dev, ...@@ -1381,7 +1389,7 @@ static int allegro_mcu_send_encode_frame(struct allegro_dev *dev,
u64 src_handle) u64 src_handle)
{ {
struct mcu_msg_encode_frame msg; struct mcu_msg_encode_frame msg;
bool use_encoder_buffer = channel->dev->has_encoder_buffer; bool use_encoder_buffer = v4l2_ctrl_g_ctrl(channel->encoder_buffer);
memset(&msg, 0, sizeof(msg)); memset(&msg, 0, sizeof(msg));
...@@ -2466,6 +2474,8 @@ static void allegro_destroy_channel(struct allegro_channel *channel) ...@@ -2466,6 +2474,8 @@ static void allegro_destroy_channel(struct allegro_channel *channel)
v4l2_ctrl_grab(channel->mpeg_video_cpb_size, false); v4l2_ctrl_grab(channel->mpeg_video_cpb_size, false);
v4l2_ctrl_grab(channel->mpeg_video_gop_size, false); v4l2_ctrl_grab(channel->mpeg_video_gop_size, false);
v4l2_ctrl_grab(channel->encoder_buffer, false);
if (channel->user_id != -1) { if (channel->user_id != -1) {
clear_bit(channel->user_id, &dev->channel_user_ids); clear_bit(channel->user_id, &dev->channel_user_ids);
channel->user_id = -1; channel->user_id = -1;
...@@ -2532,6 +2542,8 @@ static int allegro_create_channel(struct allegro_channel *channel) ...@@ -2532,6 +2542,8 @@ static int allegro_create_channel(struct allegro_channel *channel)
v4l2_ctrl_grab(channel->mpeg_video_cpb_size, true); v4l2_ctrl_grab(channel->mpeg_video_cpb_size, true);
v4l2_ctrl_grab(channel->mpeg_video_gop_size, true); v4l2_ctrl_grab(channel->mpeg_video_gop_size, true);
v4l2_ctrl_grab(channel->encoder_buffer, true);
reinit_completion(&channel->completion); reinit_completion(&channel->completion);
allegro_mcu_send_create_channel(dev, channel); allegro_mcu_send_create_channel(dev, channel);
timeout = wait_for_completion_timeout(&channel->completion, timeout = wait_for_completion_timeout(&channel->completion,
...@@ -2915,6 +2927,10 @@ static int allegro_try_ctrl(struct v4l2_ctrl *ctrl) ...@@ -2915,6 +2927,10 @@ static int allegro_try_ctrl(struct v4l2_ctrl *ctrl)
case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
allegro_clamp_bitrate(channel, ctrl); allegro_clamp_bitrate(channel, ctrl);
break; break;
case V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER:
if (!channel->dev->has_encoder_buffer)
ctrl->val = 0;
break;
} }
return 0; return 0;
...@@ -2955,6 +2971,16 @@ static const struct v4l2_ctrl_ops allegro_ctrl_ops = { ...@@ -2955,6 +2971,16 @@ static const struct v4l2_ctrl_ops allegro_ctrl_ops = {
.s_ctrl = allegro_s_ctrl, .s_ctrl = allegro_s_ctrl,
}; };
static const struct v4l2_ctrl_config allegro_encoder_buffer_ctrl_config = {
.id = V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER,
.name = "Encoder Buffer Enable",
.type = V4L2_CTRL_TYPE_BOOLEAN,
.min = 0,
.max = 1,
.step = 1,
.def = 1,
};
static int allegro_open(struct file *file) static int allegro_open(struct file *file)
{ {
struct video_device *vdev = video_devdata(file); struct video_device *vdev = video_devdata(file);
...@@ -3106,6 +3132,8 @@ static int allegro_open(struct file *file) ...@@ -3106,6 +3132,8 @@ static int allegro_open(struct file *file)
V4L2_CID_MPEG_VIDEO_GOP_SIZE, V4L2_CID_MPEG_VIDEO_GOP_SIZE,
0, ALLEGRO_GOP_SIZE_MAX, 0, ALLEGRO_GOP_SIZE_MAX,
1, ALLEGRO_GOP_SIZE_DEFAULT); 1, ALLEGRO_GOP_SIZE_DEFAULT);
channel->encoder_buffer = v4l2_ctrl_new_custom(handler,
&allegro_encoder_buffer_ctrl_config, NULL);
v4l2_ctrl_new_std(handler, v4l2_ctrl_new_std(handler,
&allegro_ctrl_ops, &allegro_ctrl_ops,
V4L2_CID_MIN_BUFFERS_FOR_OUTPUT, V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
......
...@@ -211,6 +211,11 @@ enum v4l2_colorfx { ...@@ -211,6 +211,11 @@ enum v4l2_colorfx {
* We reserve 128 controls for this driver. * We reserve 128 controls for this driver.
*/ */
#define V4L2_CID_USER_CCS_BASE (V4L2_CID_USER_BASE + 0x10f0) #define V4L2_CID_USER_CCS_BASE (V4L2_CID_USER_BASE + 0x10f0)
/*
* The base for Allegro driver controls.
* We reserve 16 controls for this driver.
*/
#define V4L2_CID_USER_ALLEGRO_BASE (V4L2_CID_USER_BASE + 0x1170)
/* MPEG-class control IDs */ /* MPEG-class control IDs */
/* The MPEG controls are applicable to all codec controls /* The MPEG controls are applicable to all codec controls
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment