The FWHT stateless 'uAPI' was staging and marked explicitly in the V4L2 specification that it will change and is unstable. Note that these control IDs were never exported as a public API, they were only defined in kernel-local headers (fwht-ctrls.h). Now, the FWHT stateless controls is ready to be part of the stable uAPI. While not too late: - Rename V4L2_CID_MPEG_VIDEO_FWHT_PARAMS to V4L2_CID_STATELESS_FWHT_PARAMS. - Move the contents of fwht-ctrls.h to v4l2-controls.h. - Move the public parts of drivers/media/test-drivers/vicodec/codec-fwht.h to v4l2-controls.h. - Add V4L2_CTRL_TYPE_FWHT_PARAMS control initialization and validation. - Add p_fwht_params to struct v4l2_ext_control.
Unified · Split
| @@ -11,6 +11,7 @@ · 10 unmodified lines | ||
| 11 | 11 | |
| 12 | 12 | #include <linux/string.h> |
| 13 | 13 | #include <linux/kernel.h> |
| 14 | +#include <linux/videodev2.h> | |
| 14 | 15 | #include "codec-fwht.h" |
| 15 | 16 | |
| 16 | 17 | #define OVERFLOW_BIT BIT(14) |
| @@ -56,38 +56,6 @@ · 55 unmodified lines | ||
| 56 | 56 | #define FWHT_MAGIC1 0x4f4f4f4f |
| 57 | 57 | #define FWHT_MAGIC2 0xffffffff |
| 58 | 58 | |
| 59 | −#define V4L2_FWHT_VERSION 3 | |
| 60 | − | |
| 61 | −/* Set if this is an interlaced format */ | |
| 62 | −#define V4L2_FWHT_FL_IS_INTERLACED BIT(0) | |
| 63 | −/* Set if this is a bottom-first (NTSC) interlaced format */ | |
| 64 | −#define V4L2_FWHT_FL_IS_BOTTOM_FIRST BIT(1) | |
| 65 | −/* Set if each 'frame' contains just one field */ | |
| 66 | −#define V4L2_FWHT_FL_IS_ALTERNATE BIT(2) | |
| 67 | −/* | |
| 68 | − * If V4L2_FWHT_FL_IS_ALTERNATE was set, then this is set if this | |
| 69 | − * 'frame' is the bottom field, else it is the top field. | |
| 70 | − */ | |
| 71 | −#define V4L2_FWHT_FL_IS_BOTTOM_FIELD BIT(3) | |
| 72 | −/* Set if this frame is uncompressed */ | |
| 73 | −#define V4L2_FWHT_FL_LUMA_IS_UNCOMPRESSED BIT(4) | |
| 74 | −#define V4L2_FWHT_FL_CB_IS_UNCOMPRESSED BIT(5) | |
| 75 | −#define V4L2_FWHT_FL_CR_IS_UNCOMPRESSED BIT(6) | |
| 76 | −#define V4L2_FWHT_FL_CHROMA_FULL_HEIGHT BIT(7) | |
| 77 | −#define V4L2_FWHT_FL_CHROMA_FULL_WIDTH BIT(8) | |
| 78 | −#define V4L2_FWHT_FL_ALPHA_IS_UNCOMPRESSED BIT(9) | |
| 79 | −#define V4L2_FWHT_FL_I_FRAME BIT(10) | |
| 80 | − | |
| 81 | −/* A 4-values flag - the number of components - 1 */ | |
| 82 | −#define V4L2_FWHT_FL_COMPONENTS_NUM_MSK GENMASK(18, 16) | |
| 83 | −#define V4L2_FWHT_FL_COMPONENTS_NUM_OFFSET 16 | |
| 84 | − | |
| 85 | −#define V4L2_FWHT_FL_PIXENC_MSK GENMASK(20, 19) | |
| 86 | −#define V4L2_FWHT_FL_PIXENC_OFFSET 19 | |
| 87 | −#define V4L2_FWHT_FL_PIXENC_YUV (1 << V4L2_FWHT_FL_PIXENC_OFFSET) | |
| 88 | −#define V4L2_FWHT_FL_PIXENC_RGB (2 << V4L2_FWHT_FL_PIXENC_OFFSET) | |
| 89 | −#define V4L2_FWHT_FL_PIXENC_HSV (3 << V4L2_FWHT_FL_PIXENC_OFFSET) | |
| 90 | − | |
| 91 | 59 | /* |
| 92 | 60 | * A macro to calculate the needed padding in order to make sure |
| 93 | 61 | * both luma and chroma components resolutions are rounded up to |
| @@ -1746,7 +1746,7 @@ static int vicodec_try_ctrl(struct v4l2_ctrl *ctrl) · 1745 unmodified lines | ||
| 1746 | 1746 | V4L2_BUF_TYPE_VIDEO_CAPTURE); |
| 1747 | 1747 | |
| 1748 | 1748 | switch (ctrl->id) { |
| 1749 | − case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS: | |
| 1749 | + case V4L2_CID_STATELESS_FWHT_PARAMS: | |
| 1750 | 1750 | if (!q_dst->info) |
| 1751 | 1751 | return -EINVAL; |
| 1752 | 1752 | params = ctrl->p_new.p_fwht_params; |
| @@ -1799,7 +1799,7 @@ static int vicodec_s_ctrl(struct v4l2_ctrl *ctrl) · 46 unmodified lines | ||
| 1799 | 1799 | case V4L2_CID_FWHT_P_FRAME_QP: |
| 1800 | 1800 | ctx->state.p_frame_qp = ctrl->val; |
| 1801 | 1801 | return 0; |
| 1802 | − case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS: | |
| 1802 | + case V4L2_CID_STATELESS_FWHT_PARAMS: | |
| 1803 | 1803 | params = ctrl->p_new.p_fwht_params; |
| 1804 | 1804 | update_header_from_stateless_params(ctx, params); |
| 1805 | 1805 | ctx->state.ref_frame_ts = params->backward_ref_ts; |
| @@ -1815,7 +1815,7 @@ static const struct v4l2_ctrl_ops vicodec_ctrl_ops = { · 9 unmodified lines | ||
| 1815 | 1815 | |
| 1816 | 1816 | static const struct v4l2_ctrl_config vicodec_ctrl_stateless_state = { |
| 1817 | 1817 | .ops = &vicodec_ctrl_ops, |
| 1818 | − .id = V4L2_CID_MPEG_VIDEO_FWHT_PARAMS, | |
| 1818 | + .id = V4L2_CID_STATELESS_FWHT_PARAMS, | |
| 1819 | 1819 | .elem_size = sizeof(struct v4l2_ctrl_fwht_params), |
| 1820 | 1820 | }; |
| 1821 | 1821 | |
| @@ -943,7 +943,6 @@ const char *v4l2_ctrl_get_name(u32 id) · 942 unmodified lines | ||
| 943 | 943 | case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME: return "Force Key Frame"; |
| 944 | 944 | case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS: return "MPEG-2 Slice Parameters"; |
| 945 | 945 | case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION: return "MPEG-2 Quantization Matrices"; |
| 946 | − case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS: return "FWHT Stateless Parameters"; | |
| 947 | 946 | case V4L2_CID_FWHT_I_FRAME_QP: return "FWHT I-Frame QP Value"; |
| 948 | 947 | case V4L2_CID_FWHT_P_FRAME_QP: return "FWHT P-Frame QP Value"; |
| 949 | 948 | |
| @@ -1185,6 +1184,7 @@ const char *v4l2_ctrl_get_name(u32 id) · 235 unmodified lines | ||
| 1185 | 1184 | case V4L2_CID_STATELESS_H264_PRED_WEIGHTS: return "H264 Prediction Weight Table"; |
| 1186 | 1185 | case V4L2_CID_STATELESS_H264_SLICE_PARAMS: return "H264 Slice Parameters"; |
| 1187 | 1186 | case V4L2_CID_STATELESS_H264_DECODE_PARAMS: return "H264 Decode Parameters"; |
| 1187 | + case V4L2_CID_STATELESS_FWHT_PARAMS: return "FWHT Stateless Parameters"; | |
| 1188 | 1188 | default: |
| 1189 | 1189 | return NULL; |
| 1190 | 1190 | } |
| @@ -1433,7 +1433,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, · 242 unmodified lines | ||
| 1433 | 1433 | case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION: |
| 1434 | 1434 | *type = V4L2_CTRL_TYPE_MPEG2_QUANTIZATION; |
| 1435 | 1435 | break; |
| 1436 | − case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS: | |
| 1436 | + case V4L2_CID_STATELESS_FWHT_PARAMS: | |
| 1437 | 1437 | *type = V4L2_CTRL_TYPE_FWHT_PARAMS; |
| 1438 | 1438 | break; |
| 1439 | 1439 | case V4L2_CID_STATELESS_H264_SPS: |
| @@ -1627,6 +1627,7 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx, · 187 unmodified lines | ||
| 1627 | 1627 | { |
| 1628 | 1628 | struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params; |
| 1629 | 1629 | struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header; |
| 1630 | + struct v4l2_ctrl_fwht_params *p_fwht_params; | |
| 1630 | 1631 | void *p = ptr.p + idx * ctrl->elem_size; |
| 1631 | 1632 | |
| 1632 | 1633 | if (ctrl->p_def.p_const) |
| @@ -1653,6 +1654,12 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx, · 20 unmodified lines | ||
| 1653 | 1654 | p_vp8_frame_header = p; |
| 1654 | 1655 | p_vp8_frame_header->num_dct_parts = 1; |
| 1655 | 1656 | break; |
| 1657 | + case V4L2_CTRL_TYPE_FWHT_PARAMS: | |
| 1658 | + p_fwht_params = p; | |
| 1659 | + p_fwht_params->version = V4L2_FWHT_VERSION; | |
| 1660 | + p_fwht_params->width = 1280; | |
| 1661 | + p_fwht_params->height = 720; | |
| 1662 | + break; | |
| 1656 | 1663 | } |
| 1657 | 1664 | } |
| 1658 | 1665 | |
| @@ -1755,6 +1762,9 @@ static void std_log(const struct v4l2_ctrl *ctrl) · 96 unmodified lines | ||
| 1755 | 1762 | case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS: |
| 1756 | 1763 | pr_cont("H264_PRED_WEIGHTS"); |
| 1757 | 1764 | break; |
| 1765 | + case V4L2_CTRL_TYPE_FWHT_PARAMS: | |
| 1766 | + pr_cont("FWHT_PARAMS"); | |
| 1767 | + break; | |
| 1758 | 1768 | default: |
| 1759 | 1769 | pr_cont("unknown type %d", ctrl->type); |
| 1760 | 1770 | break; |
| @@ -1798,6 +1808,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx, · 37 unmodified lines | ||
| 1798 | 1808 | { |
| 1799 | 1809 | struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params; |
| 1800 | 1810 | struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header; |
| 1811 | + struct v4l2_ctrl_fwht_params *p_fwht_params; | |
| 1801 | 1812 | struct v4l2_ctrl_h264_sps *p_h264_sps; |
| 1802 | 1813 | struct v4l2_ctrl_h264_pps *p_h264_pps; |
| 1803 | 1814 | struct v4l2_ctrl_h264_pred_weights *p_h264_pred_weights; |
| @@ -1857,6 +1868,11 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx, · 53 unmodified lines | ||
| 1857 | 1868 | break; |
| 1858 | 1869 | |
| 1859 | 1870 | case V4L2_CTRL_TYPE_FWHT_PARAMS: |
| 1871 | + p_fwht_params = p; | |
| 1872 | + if (p_fwht_params->version < V4L2_FWHT_VERSION) | |
| 1873 | + return -EINVAL; | |
| 1874 | + if (!p_fwht_params->width || !p_fwht_params->height) | |
| 1875 | + return -EINVAL; | |
| 1860 | 1876 | break; |
| 1861 | 1877 | |
| 1862 | 1878 | case V4L2_CTRL_TYPE_H264_SPS: |
| @@ -1,31 +0,0 @@ | ||
| 1 | −/* SPDX-License-Identifier: GPL-2.0 */ | |
| 2 | −/* | |
| 3 | − * These are the FWHT state controls for use with stateless FWHT | |
| 4 | − * codec drivers. | |
| 5 | − * | |
| 6 | − * It turns out that these structs are not stable yet and will undergo | |
| 7 | − * more changes. So keep them private until they are stable and ready to | |
| 8 | − * become part of the official public API. | |
| 9 | − */ | |
| 10 | − | |
| 11 | −#ifndef _FWHT_CTRLS_H_ | |
| 12 | −#define _FWHT_CTRLS_H_ | |
| 13 | − | |
| 14 | −#define V4L2_CTRL_TYPE_FWHT_PARAMS 0x0105 | |
| 15 | − | |
| 16 | −#define V4L2_CID_MPEG_VIDEO_FWHT_PARAMS (V4L2_CID_CODEC_BASE + 292) | |
| 17 | − | |
| 18 | −struct v4l2_ctrl_fwht_params { | |
| 19 | − __u64 backward_ref_ts; | |
| 20 | − __u32 version; | |
| 21 | − __u32 width; | |
| 22 | − __u32 height; | |
| 23 | − __u32 flags; | |
| 24 | − __u32 colorspace; | |
| 25 | − __u32 xfer_func; | |
| 26 | − __u32 ycbcr_enc; | |
| 27 | − __u32 quantization; | |
| 28 | −}; | |
| 29 | − | |
| 30 | − | |
| 31 | −#endif | |
| @@ -18,7 +18,6 @@ · 17 unmodified lines | ||
| 18 | 18 | * This will move to the public headers once this API is fully stable. |
| 19 | 19 | */ |
| 20 | 20 | #include <media/mpeg2-ctrls.h> |
| 21 | −#include <media/fwht-ctrls.h> | |
| 22 | 21 | #include <media/vp8-ctrls.h> |
| 23 | 22 | #include <media/hevc-ctrls.h> |
| 24 | 23 | |
| @@ -1565,6 +1565,76 @@ struct v4l2_ctrl_h264_decode_params { · 1564 unmodified lines | ||
| 1565 | 1565 | }; |
| 1566 | 1566 | |
| 1567 | 1567 | |
| 1568 | +/* Stateless FWHT control, used by the vicodec driver */ | |
| 1569 | + | |
| 1570 | +/* Current FWHT version */ | |
| 1571 | +#define V4L2_FWHT_VERSION 3 | |
| 1572 | + | |
| 1573 | +/* Set if this is an interlaced format */ | |
| 1574 | +#define V4L2_FWHT_FL_IS_INTERLACED BIT(0) | |
| 1575 | +/* Set if this is a bottom-first (NTSC) interlaced format */ | |
| 1576 | +#define V4L2_FWHT_FL_IS_BOTTOM_FIRST BIT(1) | |
| 1577 | +/* Set if each 'frame' contains just one field */ | |
| 1578 | +#define V4L2_FWHT_FL_IS_ALTERNATE BIT(2) | |
| 1579 | +/* | |
| 1580 | + * If V4L2_FWHT_FL_IS_ALTERNATE was set, then this is set if this | |
| 1581 | + * 'frame' is the bottom field, else it is the top field. | |
| 1582 | + */ | |
| 1583 | +#define V4L2_FWHT_FL_IS_BOTTOM_FIELD BIT(3) | |
| 1584 | +/* Set if the Y' plane is uncompressed */ | |
| 1585 | +#define V4L2_FWHT_FL_LUMA_IS_UNCOMPRESSED BIT(4) | |
| 1586 | +/* Set if the Cb plane is uncompressed */ | |
| 1587 | +#define V4L2_FWHT_FL_CB_IS_UNCOMPRESSED BIT(5) | |
| 1588 | +/* Set if the Cr plane is uncompressed */ | |
| 1589 | +#define V4L2_FWHT_FL_CR_IS_UNCOMPRESSED BIT(6) | |
| 1590 | +/* Set if the chroma plane is full height, if cleared it is half height */ | |
| 1591 | +#define V4L2_FWHT_FL_CHROMA_FULL_HEIGHT BIT(7) | |
| 1592 | +/* Set if the chroma plane is full width, if cleared it is half width */ | |
| 1593 | +#define V4L2_FWHT_FL_CHROMA_FULL_WIDTH BIT(8) | |
| 1594 | +/* Set if the alpha plane is uncompressed */ | |
| 1595 | +#define V4L2_FWHT_FL_ALPHA_IS_UNCOMPRESSED BIT(9) | |
| 1596 | +/* Set if this is an I Frame */ | |
| 1597 | +#define V4L2_FWHT_FL_I_FRAME BIT(10) | |
| 1598 | + | |
| 1599 | +/* A 4-values flag - the number of components - 1 */ | |
| 1600 | +#define V4L2_FWHT_FL_COMPONENTS_NUM_MSK GENMASK(18, 16) | |
| 1601 | +#define V4L2_FWHT_FL_COMPONENTS_NUM_OFFSET 16 | |
| 1602 | + | |
| 1603 | +/* A 4-values flag - the pixel encoding type */ | |
| 1604 | +#define V4L2_FWHT_FL_PIXENC_MSK GENMASK(20, 19) | |
| 1605 | +#define V4L2_FWHT_FL_PIXENC_OFFSET 19 | |
| 1606 | +#define V4L2_FWHT_FL_PIXENC_YUV (1 << V4L2_FWHT_FL_PIXENC_OFFSET) | |
| 1607 | +#define V4L2_FWHT_FL_PIXENC_RGB (2 << V4L2_FWHT_FL_PIXENC_OFFSET) | |
| 1608 | +#define V4L2_FWHT_FL_PIXENC_HSV (3 << V4L2_FWHT_FL_PIXENC_OFFSET) | |
| 1609 | + | |
| 1610 | +#define V4L2_CID_STATELESS_FWHT_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 100) | |
| 1611 | +/** | |
| 1612 | + * struct v4l2_ctrl_fwht_params - FWHT parameters | |
| 1613 | + * | |
| 1614 | + * @backward_ref_ts: timestamp of the V4L2 capture buffer to use as reference. | |
| 1615 | + * The timestamp refers to the timestamp field in struct v4l2_buffer. | |
| 1616 | + * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64. | |
| 1617 | + * @version: must be V4L2_FWHT_VERSION. | |
| 1618 | + * @width: width of frame. | |
| 1619 | + * @height: height of frame. | |
| 1620 | + * @flags: FWHT flags (see V4L2_FWHT_FL_*). | |
| 1621 | + * @colorspace: the colorspace (enum v4l2_colorspace). | |
| 1622 | + * @xfer_func: the transfer function (enum v4l2_xfer_func). | |
| 1623 | + * @ycbcr_enc: the Y'CbCr encoding (enum v4l2_ycbcr_encoding). | |
| 1624 | + * @quantization: the quantization (enum v4l2_quantization). | |
| 1625 | + */ | |
| 1626 | +struct v4l2_ctrl_fwht_params { | |
| 1627 | + __u64 backward_ref_ts; | |
| 1628 | + __u32 version; | |
| 1629 | + __u32 width; | |
| 1630 | + __u32 height; | |
| 1631 | + __u32 flags; | |
| 1632 | + __u32 colorspace; | |
| 1633 | + __u32 xfer_func; | |
| 1634 | + __u32 ycbcr_enc; | |
| 1635 | + __u32 quantization; | |
| 1636 | +}; | |
| 1637 | + | |
| 1568 | 1638 | /* MPEG-compression definitions kept for backwards compatibility */ |
| 1569 | 1639 | #ifndef __KERNEL__ |
| 1570 | 1640 | #define V4L2_CTRL_CLASS_MPEG V4L2_CTRL_CLASS_CODEC |
| @@ -1740,6 +1740,7 @@ struct v4l2_ext_control { · 1739 unmodified lines | ||
| 1740 | 1740 | struct v4l2_ctrl_h264_pred_weights __user *p_h264_pred_weights; |
| 1741 | 1741 | struct v4l2_ctrl_h264_slice_params __user *p_h264_slice_params; |
| 1742 | 1742 | struct v4l2_ctrl_h264_decode_params __user *p_h264_decode_params; |
| 1743 | + struct v4l2_ctrl_fwht_params __user *p_fwht_params; | |
| 1743 | 1744 | void __user *ptr; |
| 1744 | 1745 | }; |
| 1745 | 1746 | } __attribute__ ((packed)); |
| @@ -1793,6 +1794,8 @@ enum v4l2_ctrl_type { · 47 unmodified lines | ||
| 1793 | 1794 | V4L2_CTRL_TYPE_H264_SLICE_PARAMS = 0x0203, |
| 1794 | 1795 | V4L2_CTRL_TYPE_H264_DECODE_PARAMS = 0x0204, |
| 1795 | 1796 | V4L2_CTRL_TYPE_H264_PRED_WEIGHTS = 0x0205, |
| 1797 | + | |
| 1798 | + V4L2_CTRL_TYPE_FWHT_PARAMS = 0x0220, | |
| 1796 | 1799 | }; |
| 1797 | 1800 | |
| 1798 | 1801 | /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ |