Commit 98b3cd0b authored by Detlev Casanova's avatar Detlev Casanova Committed by Hans Verkuil

media: visl: Add AV1 support

Let the visl test driver accept the AV1 pixel format.
Reviewed-by: default avatarDaniel Almeida <daniel.almeida@collabora.com>
Tested-by: default avatarDaniel Almeida <daniel.almeida@collabora.com>
Signed-off-by: default avatarDetlev Casanova <detlev.casanova@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent 9f0f0013
......@@ -211,6 +211,27 @@ const struct visl_ctrls visl_hevc_ctrls = {
.num_ctrls = ARRAY_SIZE(visl_hevc_ctrl_descs),
};
static const struct visl_ctrl_desc visl_av1_ctrl_descs[] = {
{
.cfg.id = V4L2_CID_STATELESS_AV1_FRAME,
},
{
.cfg.id = V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY,
.cfg.dims = { V4L2_AV1_MAX_TILE_COUNT },
},
{
.cfg.id = V4L2_CID_STATELESS_AV1_SEQUENCE,
},
{
.cfg.id = V4L2_CID_STATELESS_AV1_FILM_GRAIN,
},
};
const struct visl_ctrls visl_av1_ctrls = {
.ctrls = visl_av1_ctrl_descs,
.num_ctrls = ARRAY_SIZE(visl_av1_ctrl_descs),
};
struct v4l2_ctrl *visl_find_control(struct visl_ctx *ctx, u32 id)
{
struct v4l2_ctrl_handler *hdl = &ctx->hdl;
......
......@@ -13,12 +13,21 @@
#include "visl-trace-vp9.h"
#include "visl-trace-h264.h"
#include "visl-trace-hevc.h"
#include "visl-trace-av1.h"
#include <linux/delay.h>
#include <linux/workqueue.h>
#include <media/v4l2-mem2mem.h>
#include <media/tpg/v4l2-tpg.h>
#define LAST_BUF_IDX (V4L2_AV1_REF_LAST_FRAME - V4L2_AV1_REF_LAST_FRAME)
#define LAST2_BUF_IDX (V4L2_AV1_REF_LAST2_FRAME - V4L2_AV1_REF_LAST_FRAME)
#define LAST3_BUF_IDX (V4L2_AV1_REF_LAST3_FRAME - V4L2_AV1_REF_LAST_FRAME)
#define GOLDEN_BUF_IDX (V4L2_AV1_REF_GOLDEN_FRAME - V4L2_AV1_REF_LAST_FRAME)
#define BWD_BUF_IDX (V4L2_AV1_REF_BWDREF_FRAME - V4L2_AV1_REF_LAST_FRAME)
#define ALT2_BUF_IDX (V4L2_AV1_REF_ALTREF2_FRAME - V4L2_AV1_REF_LAST_FRAME)
#define ALT_BUF_IDX (V4L2_AV1_REF_ALTREF_FRAME - V4L2_AV1_REF_LAST_FRAME)
static void *plane_vaddr(struct tpg_data *tpg, struct vb2_buffer *buf,
u32 p, u32 bpl[TPG_MAX_PLANES], u32 h)
{
......@@ -152,6 +161,55 @@ static void visl_get_ref_frames(struct visl_ctx *ctx, u8 *buf,
break;
}
case VISL_CODEC_AV1: {
int idx_last = run->av1.frame->ref_frame_idx[LAST_BUF_IDX];
int idx_last2 = run->av1.frame->ref_frame_idx[LAST2_BUF_IDX];
int idx_last3 = run->av1.frame->ref_frame_idx[LAST3_BUF_IDX];
int idx_golden = run->av1.frame->ref_frame_idx[GOLDEN_BUF_IDX];
int idx_bwd = run->av1.frame->ref_frame_idx[BWD_BUF_IDX];
int idx_alt2 = run->av1.frame->ref_frame_idx[ALT2_BUF_IDX];
int idx_alt = run->av1.frame->ref_frame_idx[ALT_BUF_IDX];
struct vb2_buffer *ref_last =
vb2_find_buffer(cap_q, run->av1.frame->reference_frame_ts[idx_last]);
struct vb2_buffer *ref_last2 =
vb2_find_buffer(cap_q, run->av1.frame->reference_frame_ts[idx_last2]);
struct vb2_buffer *ref_last3 =
vb2_find_buffer(cap_q, run->av1.frame->reference_frame_ts[idx_last3]);
struct vb2_buffer *ref_golden =
vb2_find_buffer(cap_q, run->av1.frame->reference_frame_ts[idx_golden]);
struct vb2_buffer *ref_bwd =
vb2_find_buffer(cap_q, run->av1.frame->reference_frame_ts[idx_bwd]);
struct vb2_buffer *ref_alt2 =
vb2_find_buffer(cap_q, run->av1.frame->reference_frame_ts[idx_alt2]);
struct vb2_buffer *ref_alt =
vb2_find_buffer(cap_q, run->av1.frame->reference_frame_ts[idx_alt]);
scnprintf(buf, buflen,
"ref_last_ts: %llu, vb2_idx: %d\n"
"ref_last2_ts: %llu, vb2_idx: %d\n"
"ref_last3_ts: %llu, vb2_idx: %d\n"
"ref_golden_ts: %llu, vb2_idx: %d\n"
"ref_bwd_ts: %llu, vb2_idx: %d\n"
"ref_alt2_ts: %llu, vb2_idx: %d\n"
"ref_alt_ts: %llu, vb2_idx: %d\n",
run->av1.frame->reference_frame_ts[idx_last],
ref_last ? ref_last->index : -1,
run->av1.frame->reference_frame_ts[idx_last2],
ref_last2 ? ref_last2->index : -1,
run->av1.frame->reference_frame_ts[idx_last3],
ref_last3 ? ref_last3->index : -1,
run->av1.frame->reference_frame_ts[idx_golden],
ref_golden ? ref_golden->index : -1,
run->av1.frame->reference_frame_ts[idx_bwd],
ref_bwd ? ref_bwd->index : -1,
run->av1.frame->reference_frame_ts[idx_alt2],
ref_alt2 ? ref_alt2->index : -1,
run->av1.frame->reference_frame_ts[idx_alt],
ref_alt ? ref_alt->index : -1);
break;
}
}
}
......@@ -425,6 +483,12 @@ static void visl_trace_ctrls(struct visl_ctx *ctx, struct visl_run *run)
trace_v4l2_hevc_pred_weight_table(&run->hevc.spram->pred_weight_table);
break;
case VISL_CODEC_AV1:
trace_v4l2_ctrl_av1_sequence(run->av1.seq);
trace_v4l2_ctrl_av1_frame(run->av1.frame);
trace_v4l2_ctrl_av1_film_grain(run->av1.grain);
trace_v4l2_ctrl_av1_tile_group_entry(run->av1.tge);
break;
}
}
......@@ -483,6 +547,12 @@ void visl_device_run(void *priv)
run.hevc.sm = visl_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_SCALING_MATRIX);
run.hevc.dpram = visl_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_DECODE_PARAMS);
break;
case VISL_CODEC_AV1:
run.av1.seq = visl_find_control_data(ctx, V4L2_CID_STATELESS_AV1_SEQUENCE);
run.av1.frame = visl_find_control_data(ctx, V4L2_CID_STATELESS_AV1_FRAME);
run.av1.tge = visl_find_control_data(ctx, V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY);
run.av1.grain = visl_find_control_data(ctx, V4L2_CID_STATELESS_AV1_FILM_GRAIN);
break;
}
frame_dprintk(ctx->dev, run.dst->sequence,
......
......@@ -45,6 +45,13 @@ struct visl_hevc_run {
const struct v4l2_ctrl_hevc_decode_params *dpram;
};
struct visl_av1_run {
const struct v4l2_ctrl_av1_sequence *seq;
const struct v4l2_ctrl_av1_frame *frame;
const struct v4l2_ctrl_av1_tile_group_entry *tge;
const struct v4l2_ctrl_av1_film_grain *grain;
};
struct visl_run {
struct vb2_v4l2_buffer *src;
struct vb2_v4l2_buffer *dst;
......@@ -56,6 +63,7 @@ struct visl_run {
struct visl_vp9_run vp9;
struct visl_h264_run h264;
struct visl_hevc_run hevc;
struct visl_av1_run av1;
};
};
......
This diff is collapsed.
......@@ -8,3 +8,4 @@
#include "visl-trace-vp9.h"
#include "visl-trace-h264.h"
#include "visl-trace-hevc.h"
#include "visl-trace-av1.h"
......@@ -40,6 +40,9 @@ static void visl_set_current_codec(struct visl_ctx *ctx)
case V4L2_PIX_FMT_HEVC_SLICE:
ctx->current_codec = VISL_CODEC_HEVC;
break;
case V4L2_PIX_FMT_AV1_FRAME:
ctx->current_codec = VISL_CODEC_AV1;
break;
default:
dprintk(ctx->dev, "Warning: unsupported fourcc: %d\n", fourcc);
ctx->current_codec = VISL_CODEC_NONE;
......@@ -218,6 +221,21 @@ const struct visl_coded_format_desc visl_coded_fmts[] = {
.num_decoded_fmts = ARRAY_SIZE(visl_decoded_fmts),
.decoded_fmts = visl_decoded_fmts,
},
{
.pixelformat = V4L2_PIX_FMT_AV1_FRAME,
.frmsize = {
.min_width = 64,
.max_width = 4096,
.step_width = 1,
.min_height = 64,
.max_height = 2304,
.step_height = 1,
},
.ctrls = &visl_av1_ctrls,
.num_decoded_fmts = ARRAY_SIZE(visl_decoded_fmts),
.decoded_fmts = visl_decoded_fmts,
},
};
const size_t num_coded_fmts = ARRAY_SIZE(visl_coded_fmts);
......
......@@ -17,6 +17,7 @@ extern const struct visl_ctrls visl_vp8_ctrls;
extern const struct visl_ctrls visl_vp9_ctrls;
extern const struct visl_ctrls visl_h264_ctrls;
extern const struct visl_ctrls visl_hevc_ctrls;
extern const struct visl_ctrls visl_av1_ctrls;
int visl_queue_init(void *priv, struct vb2_queue *src_vq,
struct vb2_queue *dst_vq);
......
......@@ -127,6 +127,7 @@ enum visl_codec {
VISL_CODEC_VP9,
VISL_CODEC_H264,
VISL_CODEC_HEVC,
VISL_CODEC_AV1,
};
struct visl_blob {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment