[PATCH v3 08/14] media: v4l: Add definitions for MPEG2 frame format and header metadata
From: Florent Revest Stateless video decoding engines require both the MPEG slices and associated metadata from the video stream in order to decode frames. This introduces definitions for a new pixel format, describing buffers with MPEG2 slice data, as well as a control structure for passing the frame header (metadata) to drivers. Signed-off-by: Florent Revest Signed-off-by: Paul Kocialkowski --- drivers/media/v4l2-core/v4l2-ctrls.c | 10 ++ drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/v4l2-controls.h | 26 ++ include/uapi/linux/videodev2.h | 3 +++ 4 files changed, 40 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index df58a23eb731..cdf860c8e3d8 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c @@ -826,6 +826,7 @@ 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_FRAME_HDR: return "MPEG2 Frame Header"; /* VPX controls */ case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:return "VPX Number of Partitions"; @@ -1271,6 +1272,9 @@ 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_FRAME_HDR: + *type = V4L2_CTRL_TYPE_MPEG2_FRAME_HDR; + break; default: *type = V4L2_CTRL_TYPE_INTEGER; break; @@ -1591,6 +1595,9 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, return -ERANGE; return 0; + case V4L2_CTRL_TYPE_MPEG2_FRAME_HDR: + return 0; + default: return -EINVAL; } @@ -2165,6 +2172,9 @@ 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_FRAME_HDR: + elem_size = sizeof(struct v4l2_ctrl_mpeg2_frame_hdr); + break; default: if (type < V4L2_CTRL_COMPOUND_TYPES) elem_size = sizeof(s32); diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index 561a1fe3160b..38d318c47c55 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -1274,6 +1274,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) case V4L2_PIX_FMT_VP8: descr = "VP8"; break; case V4L2_PIX_FMT_VP9: descr = "VP9"; break; case V4L2_PIX_FMT_HEVC: descr = "HEVC"; break; /* aka H.265 */ + case V4L2_PIX_FMT_MPEG2_FRAME: descr = "MPEG2 Frame"; break; case V4L2_PIX_FMT_CPIA1:descr = "GSPCA CPiA YUV"; break; case V4L2_PIX_FMT_WNVA: descr = "WNVA"; break; case V4L2_PIX_FMT_SN9C10X: descr = "GSPCA SN9C10X"; break; diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index 8d473c979b61..23da8bfa7e6f 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -557,6 +557,8 @@ enum v4l2_mpeg_video_mpeg4_profile { }; #define V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (V4L2_CID_MPEG_BASE+407) +#define V4L2_CID_MPEG_VIDEO_MPEG2_FRAME_HDR (V4L2_CID_MPEG_BASE+450) + /* Control IDs for VP8 streams * Although VP8 is not part of MPEG we add these controls to the MPEG class * as that class is already handling other video compression standards @@ -1076,4 +1078,28 @@ enum v4l2_detect_md_mode { #define V4L2_CID_DETECT_MD_THRESHOLD_GRID (V4L2_CID_DETECT_CLASS_BASE + 3) #define V4L2_CID_DETECT_MD_REGION_GRID (V4L2_CID_DETECT_CLASS_BASE + 4) +struct v4l2_ctrl_mpeg2_frame_hdr { + __u32 slice_len; + __u32 slice_pos; + enum { MPEG1, MPEG2 } type; + + __u16 width; + __u16 height; + + enum { PCT_I = 1, PCT_P, PCT_B, PCT_D } picture_coding_type; + __u8 f_code[2][2]; + + __u8 intra_dc_precision; + __u8 picture_structure; + __u8 top_field_first; + __u8 frame_pred_frame_dct; + __u8 concealment_motion_vectors; + __u8 q_scale_type; + __u8 intra_vlc_format; + __u8 alternate_scan; + + __u8 backward_ref_index; + __u8 forward_ref_index; +}; + #endif diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index 1f6c4b52baae..d8f9b59d90d7 100644 --- a/include/uapi/linux/vid
Re: [PATCH v3 08/14] media: v4l: Add definitions for MPEG2 frame format and header metadata
On 07/05/18 14:44, Paul Kocialkowski wrote: > From: Florent Revest > > Stateless video decoding engines require both the MPEG slices and > associated metadata from the video stream in order to decode frames. > > This introduces definitions for a new pixel format, describing buffers > with MPEG2 slice data, as well as a control structure for passing the > frame header (metadata) to drivers. > > Signed-off-by: Florent Revest > Signed-off-by: Paul Kocialkowski > --- > drivers/media/v4l2-core/v4l2-ctrls.c | 10 ++ > drivers/media/v4l2-core/v4l2-ioctl.c | 1 + > include/uapi/linux/v4l2-controls.h | 26 ++ > include/uapi/linux/videodev2.h | 3 +++ > 4 files changed, 40 insertions(+) > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c > b/drivers/media/v4l2-core/v4l2-ctrls.c > index df58a23eb731..cdf860c8e3d8 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls.c > @@ -826,6 +826,7 @@ 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_FRAME_HDR: return "MPEG2 > Frame Header"; This compound control needs to be documented in the V4l2 spec. > > /* VPX controls */ > case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:return "VPX > Number of Partitions"; > @@ -1271,6 +1272,9 @@ 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_FRAME_HDR: > + *type = V4L2_CTRL_TYPE_MPEG2_FRAME_HDR; > + break; > default: > *type = V4L2_CTRL_TYPE_INTEGER; > break; > @@ -1591,6 +1595,9 @@ static int std_validate(const struct v4l2_ctrl *ctrl, > u32 idx, > return -ERANGE; > return 0; > > + case V4L2_CTRL_TYPE_MPEG2_FRAME_HDR: > + return 0; > + > default: > return -EINVAL; > } > @@ -2165,6 +2172,9 @@ 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_FRAME_HDR: > + elem_size = sizeof(struct v4l2_ctrl_mpeg2_frame_hdr); > + break; > default: > if (type < V4L2_CTRL_COMPOUND_TYPES) > elem_size = sizeof(s32); > diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c > b/drivers/media/v4l2-core/v4l2-ioctl.c > index 561a1fe3160b..38d318c47c55 100644 > --- a/drivers/media/v4l2-core/v4l2-ioctl.c > +++ b/drivers/media/v4l2-core/v4l2-ioctl.c > @@ -1274,6 +1274,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) > case V4L2_PIX_FMT_VP8: descr = "VP8"; break; > case V4L2_PIX_FMT_VP9: descr = "VP9"; break; > case V4L2_PIX_FMT_HEVC: descr = "HEVC"; break; /* aka > H.265 */ > + case V4L2_PIX_FMT_MPEG2_FRAME: descr = "MPEG2 Frame"; break; Needs to be documented in the spec. > case V4L2_PIX_FMT_CPIA1:descr = "GSPCA CPiA YUV"; break; > case V4L2_PIX_FMT_WNVA: descr = "WNVA"; break; > case V4L2_PIX_FMT_SN9C10X: descr = "GSPCA SN9C10X"; break; > diff --git a/include/uapi/linux/v4l2-controls.h > b/include/uapi/linux/v4l2-controls.h > index 8d473c979b61..23da8bfa7e6f 100644 > --- a/include/uapi/linux/v4l2-controls.h > +++ b/include/uapi/linux/v4l2-controls.h > @@ -557,6 +557,8 @@ enum v4l2_mpeg_video_mpeg4_profile { > }; > #define V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (V4L2_CID_MPEG_BASE+407) > > +#define V4L2_CID_MPEG_VIDEO_MPEG2_FRAME_HDR (V4L2_CID_MPEG_BASE+450) > + > /* Control IDs for VP8 streams > * Although VP8 is not part of MPEG we add these controls to the MPEG class > * as that class is already handling other video compression standards > @@ -1076,4 +1078,28 @@ enum v4l2_detect_md_mode { > #define V4L2_CID_DETECT_MD_THRESHOLD_GRID(V4L2_CID_DETECT_CLASS_BASE + 3) > #define V4L2_CID_DETECT_MD_REGION_GRID > (V4L2_CID_DETECT_CLASS_BASE + 4) > > +struct v4l2_ctrl_mpeg2_frame_hdr { > + __u32 slice_len; > + __u32 slice_pos; > + enum { MPEG1, MPEG2 } type; Still an enum? > + > + __u16 width; > + __u16 height; > + > + enum { PCT_I = 1, PCT_P, PCT_B, PCT_D } picture_coding_type; > + __u8 f_code[2][2]; > + > + __u8 intra_dc_precision; > + __u8 picture_structure; > + __u8 top_field_first; > + __u8 frame_pred_frame_dct; > + __u8 concealment_motion_vectors; >
Re: [PATCH v3 08/14] media: v4l: Add definitions for MPEG2 frame format and header metadata
Hi Hans, On Mon, 2018-05-07 at 15:49 +0200, Hans Verkuil wrote: > On 07/05/18 14:44, Paul Kocialkowski wrote: > > From: Florent Revest > > > > Stateless video decoding engines require both the MPEG slices and > > associated metadata from the video stream in order to decode frames. > > > > This introduces definitions for a new pixel format, describing > > buffers > > with MPEG2 slice data, as well as a control structure for passing > > the > > frame header (metadata) to drivers. Thanks for the review! I should have made it clear that this patch has not seen any improvement between v2 and v3. Cleaning up and documenting the MPEG2 headers is still in the tasks list (presented in the cover letter), as well as the MB32 NV12 format. > > Signed-off-by: Florent Revest > > Signed-off-by: Paul Kocialkowski > > --- > > drivers/media/v4l2-core/v4l2-ctrls.c | 10 ++ > > drivers/media/v4l2-core/v4l2-ioctl.c | 1 + > > include/uapi/linux/v4l2-controls.h | 26 > > ++ > > include/uapi/linux/videodev2.h | 3 +++ > > 4 files changed, 40 insertions(+) > > > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c > > b/drivers/media/v4l2-core/v4l2-ctrls.c > > index df58a23eb731..cdf860c8e3d8 100644 > > --- a/drivers/media/v4l2-core/v4l2-ctrls.c > > +++ b/drivers/media/v4l2-core/v4l2-ctrls.c > > @@ -826,6 +826,7 @@ 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: re > > turn "Force Key Frame"; > > + case V4L2_CID_MPEG_VIDEO_MPEG2_FRAME_HDR: re > > turn "MPEG2 Frame Header"; > > This compound control needs to be documented in the V4l2 spec. > > > > > /* VPX controls */ > > case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS: > > return "VPX Number of Partitions"; > > @@ -1271,6 +1272,9 @@ 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_FRAME_HDR: > > + *type = V4L2_CTRL_TYPE_MPEG2_FRAME_HDR; > > + break; > > default: > > *type = V4L2_CTRL_TYPE_INTEGER; > > break; > > @@ -1591,6 +1595,9 @@ static int std_validate(const struct v4l2_ctrl > > *ctrl, u32 idx, > > return -ERANGE; > > return 0; > > > > + case V4L2_CTRL_TYPE_MPEG2_FRAME_HDR: > > + return 0; > > + > > default: > > return -EINVAL; > > } > > @@ -2165,6 +2172,9 @@ 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_FRAME_HDR: > > + elem_size = sizeof(struct > > v4l2_ctrl_mpeg2_frame_hdr); > > + break; > > default: > > if (type < V4L2_CTRL_COMPOUND_TYPES) > > elem_size = sizeof(s32); > > diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c > > b/drivers/media/v4l2-core/v4l2-ioctl.c > > index 561a1fe3160b..38d318c47c55 100644 > > --- a/drivers/media/v4l2-core/v4l2-ioctl.c > > +++ b/drivers/media/v4l2-core/v4l2-ioctl.c > > @@ -1274,6 +1274,7 @@ static void v4l_fill_fmtdesc(struct > > v4l2_fmtdesc *fmt) > > case V4L2_PIX_FMT_VP8: descr = > > "VP8"; break; > > case V4L2_PIX_FMT_VP9: descr = > > "VP9"; break; > > case V4L2_PIX_FMT_HEVC: descr = > > "HEVC"; break; /* aka H.265 */ > > + case V4L2_PIX_FMT_MPEG2_FRAME: descr = > > "MPEG2 Frame"; break; > > Needs to be documented in the spec. > > > case V4L2_PIX_FMT_CPIA1:descr = "GSPCA CPiA > > YUV"; break; > > case V4L2_PIX_FMT_WNVA: descr = > > "WNVA"; break; > > case V4L2_PIX_FMT_SN9C10X: descr = "GSPCA > > SN9C10X"; break; > > diff --git a/include/uapi/linux/v4l2-controls.h > > b/include/uapi/linux/v4l2-controls.h > > index 8d473c979b61..23da8bfa7e6f 100644 > > --- a/include/uapi/linux/v4l2-controls.h > > +++ b/include/uapi/linux/v4l2-controls.h > > @@ -557,6 +557,8 @@ enum v4l2_mpeg_video_mpeg4_profile { > > }; > > #define V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (V4L2_CID_MPE > > G_BASE+407) > > > > +#define > > V4L2_CID_MPEG_VIDEO_MPEG2_FRAME_HDR (V4L2_CID_MPEG_BASE+450) > > + > > /* Control IDs for VP8 streams > > * Although VP8 is not part of MPEG we add these controls to the > > MPEG class > > * as that class is already handling other video compression > > standards > > @@ -1076,4 +1078,28 @@ enum v4l2_detect_md_mode { > > #define V4L2_CID_DETECT_MD_THRESHOLD_GRID (V4L2_CID_DETECT_C > > LASS_BASE + 3) > > #define V4L2_CID_DETECT_MD_REGION_GRID
Re: [PATCH v3 08/14] media: v4l: Add definitions for MPEG2 frame format and header metadata
Hi Florent, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linuxtv-media/master] [also build test WARNING on v4.17-rc5 next-20180516] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Paul-Kocialkowski/Sunxi-Cedrus-driver-for-the-Allwinner-Video-Engine-using-media-requests/20180508-004955 base: git://linuxtv.org/media_tree.git master config: x86_64-acpi-redef (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All warnings (new ones prefixed by >>): >> ./usr/include/linux/v4l2-controls.h:1082: found __[us]{8,16,32,64} type >> without #include --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip