@ -84,6 +84,13 @@ static struct s5p_mfc_fmt formats[] = {
. type = MFC_FMT_ENC ,
. num_planes = 1 ,
} ,
{
. name = " VP8 Encoded Stream " ,
. fourcc = V4L2_PIX_FMT_VP8 ,
. codec_mode = S5P_MFC_CODEC_VP8_ENC ,
. type = MFC_FMT_ENC ,
. num_planes = 1 ,
} ,
} ;
# define NUM_FORMATS ARRAY_SIZE(formats)
@ -557,6 +564,60 @@ static struct mfc_control controls[] = {
. step = 1 ,
. default_value = 0 ,
} ,
{
. id = V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS ,
. type = V4L2_CTRL_TYPE_INTEGER_MENU ,
. maximum = V4L2_CID_MPEG_VIDEO_VPX_8_PARTITIONS ,
. default_value = V4L2_CID_MPEG_VIDEO_VPX_1_PARTITION ,
. menu_skip_mask = 0 ,
} ,
{
. id = V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4 ,
. type = V4L2_CTRL_TYPE_BOOLEAN ,
. minimum = 0 ,
. maximum = 1 ,
. step = 1 ,
. default_value = 0 ,
} ,
{
. id = V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES ,
. type = V4L2_CTRL_TYPE_INTEGER_MENU ,
. maximum = V4L2_CID_MPEG_VIDEO_VPX_2_REF_FRAME ,
. default_value = V4L2_CID_MPEG_VIDEO_VPX_1_REF_FRAME ,
. menu_skip_mask = 0 ,
} ,
{
. id = V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL ,
. type = V4L2_CTRL_TYPE_INTEGER ,
. minimum = 0 ,
. maximum = 63 ,
. step = 1 ,
. default_value = 0 ,
} ,
{
. id = V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS ,
. type = V4L2_CTRL_TYPE_INTEGER ,
. minimum = 0 ,
. maximum = 7 ,
. step = 1 ,
. default_value = 0 ,
} ,
{
. id = V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD ,
. type = V4L2_CTRL_TYPE_INTEGER ,
. minimum = 0 ,
. maximum = ( 1 < < 16 ) - 1 ,
. step = 1 ,
. default_value = 0 ,
} ,
{
. id = V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL ,
. type = V4L2_CTRL_TYPE_MENU ,
. minimum = V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV ,
. maximum = V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_REF_PERIOD ,
. default_value = V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV ,
. menu_skip_mask = 0 ,
} ,
} ;
# define NUM_CTRLS ARRAY_SIZE(controls)
@ -965,6 +1026,10 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
mfc_err ( " failed to set capture format \n " ) ;
return - EINVAL ;
}
if ( ! IS_MFCV7 ( dev ) & & ( fmt - > fourcc = = V4L2_PIX_FMT_VP8 ) ) {
mfc_err ( " VP8 is supported only in MFC v7 \n " ) ;
return - EINVAL ;
}
ctx - > state = MFCINST_INIT ;
ctx - > dst_fmt = fmt ;
ctx - > codec_mode = ctx - > dst_fmt - > codec_mode ;
@ -1482,6 +1547,27 @@ static int s5p_mfc_enc_s_ctrl(struct v4l2_ctrl *ctrl)
case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL :
p - > codec . mpeg4 . quarter_pixel = ctrl - > val ;
break ;
case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS :
p - > codec . vp8 . num_partitions = ctrl - > val ;
break ;
case V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4 :
p - > codec . vp8 . imd_4x4 = ctrl - > val ;
break ;
case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES :
p - > codec . vp8 . num_ref = ctrl - > val ;
break ;
case V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL :
p - > codec . vp8 . filter_level = ctrl - > val ;
break ;
case V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS :
p - > codec . vp8 . filter_sharpness = ctrl - > val ;
break ;
case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD :
p - > codec . vp8 . golden_frame_ref_period = ctrl - > val ;
break ;
case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL :
p - > codec . vp8 . golden_frame_sel = ctrl - > val ;
break ;
default :
v4l2_err ( & dev - > v4l2_dev , " Invalid control, id=%d, val=%d \n " ,
ctrl - > id , ctrl - > val ) ;
@ -1930,7 +2016,9 @@ int s5p_mfc_enc_ctrls_setup(struct s5p_mfc_ctx *ctx)
ctx - > ctrls [ i ] = v4l2_ctrl_new_custom ( & ctx - > ctrl_handler ,
& cfg , NULL ) ;
} else {
if ( controls [ i ] . type = = V4L2_CTRL_TYPE_MENU ) {
if ( ( controls [ i ] . type = = V4L2_CTRL_TYPE_MENU ) | |
( controls [ i ] . type = =
V4L2_CTRL_TYPE_INTEGER_MENU ) ) {
ctx - > ctrls [ i ] = v4l2_ctrl_new_std_menu (
& ctx - > ctrl_handler ,
& s5p_mfc_enc_ctrl_ops , controls [ i ] . id ,