Commit f84fdf99 authored by Maxime Jourdan's avatar Maxime Jourdan Committed by Mauro Carvalho Chehab

media: meson: vdec: enable mcrcc for VP9

The motion compensation reference cache controller allows caching
parts of reference frames for faster decoding.

Fixes: 00c43088 ("media: meson: vdec: add VP9 decoder support")
Signed-off-by: default avatarMaxime Jourdan <mjourdan@baylibre.com>
Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 149d65e5
...@@ -854,6 +854,36 @@ static int codec_vp9_stop(struct amvdec_session *sess) ...@@ -854,6 +854,36 @@ static int codec_vp9_stop(struct amvdec_session *sess)
return 0; return 0;
} }
/*
* Program LAST & GOLDEN frames into the motion compensation reference cache
* controller
*/
static void codec_vp9_set_mcrcc(struct amvdec_session *sess)
{
struct amvdec_core *core = sess->core;
struct codec_vp9 *vp9 = sess->priv;
u32 val;
/* Reset mcrcc */
amvdec_write_dos(core, HEVCD_MCRCC_CTL1, 0x2);
/* Disable on I-frame */
if (vp9->cur_frame->type == KEY_FRAME || vp9->cur_frame->intra_only) {
amvdec_write_dos(core, HEVCD_MCRCC_CTL1, 0x0);
return;
}
amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, BIT(1));
val = amvdec_read_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR) & 0xffff;
val |= (val << 16);
amvdec_write_dos(core, HEVCD_MCRCC_CTL2, val);
val = amvdec_read_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR) & 0xffff;
val |= (val << 16);
amvdec_write_dos(core, HEVCD_MCRCC_CTL3, val);
/* Enable mcrcc progressive-mode */
amvdec_write_dos(core, HEVCD_MCRCC_CTL1, 0xff0);
}
static void codec_vp9_set_sao(struct amvdec_session *sess, static void codec_vp9_set_sao(struct amvdec_session *sess,
struct vb2_buffer *vb) struct vb2_buffer *vb)
{ {
...@@ -1267,6 +1297,7 @@ static void codec_vp9_process_frame(struct amvdec_session *sess) ...@@ -1267,6 +1297,7 @@ static void codec_vp9_process_frame(struct amvdec_session *sess)
amvdec_write_dos(core, HEVC_PARSER_PICTURE_SIZE, amvdec_write_dos(core, HEVC_PARSER_PICTURE_SIZE,
(vp9->height << 16) | vp9->width); (vp9->height << 16) | vp9->width);
codec_vp9_set_mcrcc(sess);
codec_vp9_set_sao(sess, &vp9->cur_frame->vbuf->vb2_buf); codec_vp9_set_sao(sess, &vp9->cur_frame->vbuf->vb2_buf);
vp9_loop_filter_frame_init(core, &vp9->seg_4lf, vp9_loop_filter_frame_init(core, &vp9->seg_4lf,
......
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