mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 14:43:58 +08:00
media: meson: vdec: enable mcrcc for VP9
The motion compensation reference cache controller allows caching
parts of reference frames for faster decoding.
Fixes: 00c43088aa
("media: meson: vdec: add VP9 decoder support")
Signed-off-by: Maxime Jourdan <mjourdan@baylibre.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
149d65e549
commit
f84fdf99e9
@ -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)
|
|||||||
|
|
||||||
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user