media: venus: Add a handling of QC10C compressed format
This adds QC10C compressed pixel format in the Venus driver, and make it possible to discover from v4l2 clients. Note: The QC10C format will be enumerable via VIDIOC_ENUM_FMT when the bitstream is 10-bits and the headers are parsed. Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
1af7d8dacf
commit
cef92b14e6
2 changed files with 20 additions and 25 deletions
|
|
@ -610,6 +610,8 @@ static u32 to_hfi_raw_fmt(u32 v4l2_fmt)
|
||||||
return HFI_COLOR_FORMAT_NV21;
|
return HFI_COLOR_FORMAT_NV21;
|
||||||
case V4L2_PIX_FMT_QC08C:
|
case V4L2_PIX_FMT_QC08C:
|
||||||
return HFI_COLOR_FORMAT_NV12_UBWC;
|
return HFI_COLOR_FORMAT_NV12_UBWC;
|
||||||
|
case V4L2_PIX_FMT_QC10C:
|
||||||
|
return HFI_COLOR_FORMAT_YUV420_TP10_UBWC;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1192,7 +1194,8 @@ int venus_helper_set_format_constraints(struct venus_inst *inst)
|
||||||
if (!IS_V6(inst->core))
|
if (!IS_V6(inst->core))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (inst->opb_fmt == HFI_COLOR_FORMAT_NV12_UBWC)
|
if (inst->opb_fmt == HFI_COLOR_FORMAT_NV12_UBWC ||
|
||||||
|
inst->opb_fmt == HFI_COLOR_FORMAT_YUV420_TP10_UBWC)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pconstraint.buffer_type = HFI_BUFFER_OUTPUT2;
|
pconstraint.buffer_type = HFI_BUFFER_OUTPUT2;
|
||||||
|
|
@ -1763,27 +1766,6 @@ int venus_helper_get_out_fmts(struct venus_inst *inst, u32 v4l2_fmt,
|
||||||
if (!caps)
|
if (!caps)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (inst->bit_depth == VIDC_BITDEPTH_10 &&
|
|
||||||
inst->session_type == VIDC_SESSION_TYPE_DEC) {
|
|
||||||
found_ubwc =
|
|
||||||
find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT,
|
|
||||||
HFI_COLOR_FORMAT_YUV420_TP10_UBWC);
|
|
||||||
found = find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT2,
|
|
||||||
HFI_COLOR_FORMAT_NV12);
|
|
||||||
if (found_ubwc && found) {
|
|
||||||
/*
|
|
||||||
* Hard-code DPB buffers to be 10bit UBWC and decoder
|
|
||||||
* output buffers in 8bit NV12 until V4L2 is able to
|
|
||||||
* expose compressed/tiled formats to applications.
|
|
||||||
*/
|
|
||||||
*out_fmt = HFI_COLOR_FORMAT_YUV420_TP10_UBWC;
|
|
||||||
*out2_fmt = HFI_COLOR_FORMAT_NV12;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ubwc) {
|
if (ubwc) {
|
||||||
ubwc_fmt = fmt | HFI_COLOR_FORMAT_UBWC_BASE;
|
ubwc_fmt = fmt | HFI_COLOR_FORMAT_UBWC_BASE;
|
||||||
found_ubwc = find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT,
|
found_ubwc = find_fmt_from_caps(caps, HFI_BUFFER_OUTPUT,
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,10 @@ static const struct venus_format vdec_formats[] = {
|
||||||
.num_planes = 1,
|
.num_planes = 1,
|
||||||
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
|
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
|
||||||
}, {
|
}, {
|
||||||
|
.pixfmt = V4L2_PIX_FMT_QC10C,
|
||||||
|
.num_planes = 1,
|
||||||
|
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
|
||||||
|
},{
|
||||||
.pixfmt = V4L2_PIX_FMT_NV12,
|
.pixfmt = V4L2_PIX_FMT_NV12,
|
||||||
.num_planes = 1,
|
.num_planes = 1,
|
||||||
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
|
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
|
||||||
|
|
@ -114,6 +118,10 @@ find_format(struct venus_inst *inst, u32 pixfmt, u32 type)
|
||||||
!venus_helper_check_format(inst, fmt[i].pixfmt))
|
!venus_helper_check_format(inst, fmt[i].pixfmt))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (V4L2_TYPE_IS_CAPTURE(type) && fmt[i].pixfmt == V4L2_PIX_FMT_QC10C &&
|
||||||
|
!(inst->bit_depth == VIDC_BITDEPTH_10))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return &fmt[i];
|
return &fmt[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,11 +141,16 @@ find_format_by_index(struct venus_inst *inst, unsigned int index, u32 type)
|
||||||
if (fmt[i].type != type)
|
if (fmt[i].type != type)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (V4L2_TYPE_IS_OUTPUT(type))
|
if (V4L2_TYPE_IS_OUTPUT(type)) {
|
||||||
valid = venus_helper_check_codec(inst, fmt[i].pixfmt);
|
valid = venus_helper_check_codec(inst, fmt[i].pixfmt);
|
||||||
else if (V4L2_TYPE_IS_CAPTURE(type))
|
} else if (V4L2_TYPE_IS_CAPTURE(type)) {
|
||||||
valid = venus_helper_check_format(inst, fmt[i].pixfmt);
|
valid = venus_helper_check_format(inst, fmt[i].pixfmt);
|
||||||
|
|
||||||
|
if (fmt[i].pixfmt == V4L2_PIX_FMT_QC10C &&
|
||||||
|
!(inst->bit_depth == VIDC_BITDEPTH_10))
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (k == index && valid)
|
if (k == index && valid)
|
||||||
break;
|
break;
|
||||||
if (valid)
|
if (valid)
|
||||||
|
|
@ -1539,7 +1552,7 @@ static const struct hfi_inst_ops vdec_hfi_ops = {
|
||||||
static void vdec_inst_init(struct venus_inst *inst)
|
static void vdec_inst_init(struct venus_inst *inst)
|
||||||
{
|
{
|
||||||
inst->hfi_codec = HFI_VIDEO_CODEC_H264;
|
inst->hfi_codec = HFI_VIDEO_CODEC_H264;
|
||||||
inst->fmt_out = &vdec_formats[7];
|
inst->fmt_out = &vdec_formats[8];
|
||||||
inst->fmt_cap = &vdec_formats[0];
|
inst->fmt_cap = &vdec_formats[0];
|
||||||
inst->width = frame_width_min(inst);
|
inst->width = frame_width_min(inst);
|
||||||
inst->height = ALIGN(frame_height_min(inst), 32);
|
inst->height = ALIGN(frame_height_min(inst), 32);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue