media: v4l: Add definitions for MPEG-2 slice format and metadata
Stateless video decoding engines require both the MPEG-2 slices and associated metadata from the video stream in order to decode frames. This introduces definitions for a new pixel format, describing buffers with MPEG-2 slice data, as well as control structure sfor passing the frame metadata to drivers. This is based on work from both Florent Revest and Hugues Fruchet. Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com> Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:

committed by
Mauro Carvalho Chehab

parent
515c5a7333
commit
c27bb30e7b
@@ -844,6 +844,8 @@ const char *v4l2_ctrl_get_name(u32 id)
|
||||
case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE: return "Vertical MV Search Range";
|
||||
case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER: return "Repeat Sequence Header";
|
||||
case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME: return "Force Key Frame";
|
||||
case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS: return "MPEG-2 Slice Parameters";
|
||||
case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION: return "MPEG-2 Quantization Matrices";
|
||||
|
||||
/* VPX controls */
|
||||
case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS: return "VPX Number of Partitions";
|
||||
@@ -1292,6 +1294,12 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
|
||||
case V4L2_CID_RDS_TX_ALT_FREQS:
|
||||
*type = V4L2_CTRL_TYPE_U32;
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:
|
||||
*type = V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS;
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION:
|
||||
*type = V4L2_CTRL_TYPE_MPEG2_QUANTIZATION;
|
||||
break;
|
||||
default:
|
||||
*type = V4L2_CTRL_TYPE_INTEGER;
|
||||
break;
|
||||
@@ -1550,6 +1558,7 @@ static void std_log(const struct v4l2_ctrl *ctrl)
|
||||
static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
|
||||
union v4l2_ctrl_ptr ptr)
|
||||
{
|
||||
struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
|
||||
size_t len;
|
||||
u64 offset;
|
||||
s64 val;
|
||||
@@ -1612,6 +1621,54 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
|
||||
return -ERANGE;
|
||||
return 0;
|
||||
|
||||
case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
|
||||
p_mpeg2_slice_params = ptr.p;
|
||||
|
||||
switch (p_mpeg2_slice_params->sequence.chroma_format) {
|
||||
case 1: /* 4:2:0 */
|
||||
case 2: /* 4:2:2 */
|
||||
case 3: /* 4:4:4 */
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (p_mpeg2_slice_params->picture.intra_dc_precision) {
|
||||
case 0: /* 8 bits */
|
||||
case 1: /* 9 bits */
|
||||
case 11: /* 11 bits */
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (p_mpeg2_slice_params->picture.picture_structure) {
|
||||
case 1: /* interlaced top field */
|
||||
case 2: /* interlaced bottom field */
|
||||
case 3: /* progressive */
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (p_mpeg2_slice_params->picture.picture_coding_type) {
|
||||
case V4L2_MPEG2_PICTURE_CODING_TYPE_I:
|
||||
case V4L2_MPEG2_PICTURE_CODING_TYPE_P:
|
||||
case V4L2_MPEG2_PICTURE_CODING_TYPE_B:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (p_mpeg2_slice_params->backward_ref_index >= VIDEO_MAX_FRAME ||
|
||||
p_mpeg2_slice_params->forward_ref_index >= VIDEO_MAX_FRAME)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
|
||||
case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -2186,6 +2243,12 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
|
||||
case V4L2_CTRL_TYPE_U32:
|
||||
elem_size = sizeof(u32);
|
||||
break;
|
||||
case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
|
||||
elem_size = sizeof(struct v4l2_ctrl_mpeg2_slice_params);
|
||||
break;
|
||||
case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
|
||||
elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantization);
|
||||
break;
|
||||
default:
|
||||
if (type < V4L2_CTRL_COMPOUND_TYPES)
|
||||
elem_size = sizeof(s32);
|
||||
|
@@ -1309,6 +1309,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
|
||||
case V4L2_PIX_FMT_H263: descr = "H.263"; break;
|
||||
case V4L2_PIX_FMT_MPEG1: descr = "MPEG-1 ES"; break;
|
||||
case V4L2_PIX_FMT_MPEG2: descr = "MPEG-2 ES"; break;
|
||||
case V4L2_PIX_FMT_MPEG2_SLICE: descr = "MPEG-2 Parsed Slice Data"; break;
|
||||
case V4L2_PIX_FMT_MPEG4: descr = "MPEG-4 part 2 ES"; break;
|
||||
case V4L2_PIX_FMT_XVID: descr = "Xvid"; break;
|
||||
case V4L2_PIX_FMT_VC1_ANNEX_G: descr = "VC-1 (SMPTE 412M Annex G)"; break;
|
||||
|
Reference in New Issue
Block a user