The G2 core decoder engine produces NV12_4L4 format, which is a simple NV12 4x4 tiled format. The driver currently hides this format by always enabling the post-processor engine, and therefore offering NV12 directly. This is done without using the logic in hantro_postproc.c and therefore makes it difficult to add VP9 cleanly. Since fixing this is not easy, add a small quirk to force NV12 if HEVC was configured, but otherwise declare NV12_4L4 as the pixel format in imx8mq_vpu_g2_variant.dec_fmts. This will be used by the VP9 decoder which will be added soon.
Unified · Split
| @@ -150,6 +150,20 @@ static int vidioc_enum_fmt(struct file *file, void *priv, · 149 unmodified lines | ||
| 150 | 150 | unsigned int num_fmts, i, j = 0; |
| 151 | 151 | bool skip_mode_none; |
| 152 | 152 | |
| 153 | + /* | |
| 154 | + * The HEVC decoder on the G2 core needs a little quirk to offer NV12 | |
| 155 | + * only on the capture side. Once the post-processor logic is used, | |
| 156 | + * we will be able to expose NV12_4L4 and NV12 as the other cases, | |
| 157 | + * and therefore remove this quirk. | |
| 158 | + */ | |
| 159 | + if (capture && ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE) { | |
| 160 | + if (f->index == 0) { | |
| 161 | + f->pixelformat = V4L2_PIX_FMT_NV12; | |
| 162 | + return 0; | |
| 163 | + } | |
| 164 | + return -EINVAL; | |
| 165 | + } | |
| 166 | + | |
| 153 | 167 | /* |
| 154 | 168 | * When dealing with an encoder: |
| 155 | 169 | * - on the capture side we want to filter out all MODE_NONE formats. |
| @@ -134,7 +134,7 @@ static const struct hantro_fmt imx8m_vpu_dec_fmts[] = { · 133 unmodified lines | ||
| 134 | 134 | |
| 135 | 135 | static const struct hantro_fmt imx8m_vpu_g2_dec_fmts[] = { |
| 136 | 136 | { |
| 137 | − .fourcc = V4L2_PIX_FMT_NV12, | |
| 137 | + .fourcc = V4L2_PIX_FMT_NV12_4L4, | |
| 138 | 138 | .codec_mode = HANTRO_MODE_NONE, |
| 139 | 139 | }, |
| 140 | 140 | { |