mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
rockchip: enable HEVC (8/10 bit) and VP9 (8 bit) decoding on RK3328 and RK3399
This should really be seen as WIP, since not all (HEVC) respectively very few (VP9) samples are decoded / rendered correctly.
This commit is contained in:
parent
6528f66833
commit
07446da506
@ -0,0 +1,123 @@
|
||||
From 5e9575a822a94139bdcfe6a7fa78e4ef771ccb39 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Wed, 13 May 2020 22:51:21 +0000
|
||||
Subject: [PATCH] WIP: hevc rkvdec fields
|
||||
|
||||
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
||||
---
|
||||
libavcodec/hevc-ctrls.h | 17 +++++++++++++----
|
||||
libavcodec/v4l2_request_hevc.c | 12 ++++++++++++
|
||||
2 files changed, 25 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libavcodec/hevc-ctrls.h b/libavcodec/hevc-ctrls.h
|
||||
index d1b094c8aaeb..b33e1a8141e1 100644
|
||||
--- a/libavcodec/hevc-ctrls.h
|
||||
+++ b/libavcodec/hevc-ctrls.h
|
||||
@@ -56,6 +56,9 @@ enum v4l2_mpeg_video_hevc_start_code {
|
||||
/* The controls are not stable at the moment and will likely be reworked. */
|
||||
struct v4l2_ctrl_hevc_sps {
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */
|
||||
+ __u8 video_parameter_set_id;
|
||||
+ __u8 seq_parameter_set_id;
|
||||
+ __u8 chroma_format_idc;
|
||||
__u16 pic_width_in_luma_samples;
|
||||
__u16 pic_height_in_luma_samples;
|
||||
__u8 bit_depth_luma_minus8;
|
||||
@@ -76,9 +79,9 @@ struct v4l2_ctrl_hevc_sps {
|
||||
__u8 log2_diff_max_min_pcm_luma_coding_block_size;
|
||||
__u8 num_short_term_ref_pic_sets;
|
||||
__u8 num_long_term_ref_pics_sps;
|
||||
- __u8 chroma_format_idc;
|
||||
|
||||
- __u8 padding;
|
||||
+ __u8 num_slices;
|
||||
+ __u8 padding[6];
|
||||
|
||||
__u64 flags;
|
||||
};
|
||||
@@ -105,7 +108,10 @@ struct v4l2_ctrl_hevc_sps {
|
||||
|
||||
struct v4l2_ctrl_hevc_pps {
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */
|
||||
+ __u8 pic_parameter_set_id;
|
||||
__u8 num_extra_slice_header_bits;
|
||||
+ __u8 num_ref_idx_l0_default_active_minus1;
|
||||
+ __u8 num_ref_idx_l1_default_active_minus1;
|
||||
__s8 init_qp_minus26;
|
||||
__u8 diff_cu_qp_delta_depth;
|
||||
__s8 pps_cb_qp_offset;
|
||||
@@ -118,7 +124,7 @@ struct v4l2_ctrl_hevc_pps {
|
||||
__s8 pps_tc_offset_div2;
|
||||
__u8 log2_parallel_merge_level_minus2;
|
||||
|
||||
- __u8 padding[4];
|
||||
+ __u8 padding;
|
||||
__u64 flags;
|
||||
};
|
||||
|
||||
@@ -204,7 +210,10 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u8 num_rps_poc_st_curr_after;
|
||||
__u8 num_rps_poc_lt_curr;
|
||||
|
||||
- __u8 padding;
|
||||
+ __u16 short_term_ref_pic_set_size;
|
||||
+ __u16 long_term_ref_pic_set_size;
|
||||
+
|
||||
+ __u8 padding[5];
|
||||
|
||||
__u32 entry_point_offset_minus1[256];
|
||||
|
||||
diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c
|
||||
index 7e77c83e4e4b..9c6916bcb453 100644
|
||||
--- a/libavcodec/v4l2_request_hevc.c
|
||||
+++ b/libavcodec/v4l2_request_hevc.c
|
||||
@@ -169,6 +169,9 @@ static void v4l2_request_hevc_fill_slice_params(const HEVCContext *h,
|
||||
.num_rps_poc_st_curr_before = h->rps[ST_CURR_BEF].nb_refs,
|
||||
.num_rps_poc_st_curr_after = h->rps[ST_CURR_AFT].nb_refs,
|
||||
.num_rps_poc_lt_curr = h->rps[LT_CURR].nb_refs,
|
||||
+
|
||||
+ .short_term_ref_pic_set_size = sh->short_term_ref_pic_set_size,
|
||||
+ .long_term_ref_pic_set_size = sh->long_term_ref_pic_set_size,
|
||||
};
|
||||
|
||||
if (sh->slice_sample_adaptive_offset_flag[0])
|
||||
@@ -239,9 +242,12 @@ static void v4l2_request_hevc_fill_slice_params(const HEVCContext *h,
|
||||
static void fill_sps(struct v4l2_ctrl_hevc_sps *ctrl, const HEVCContext *h)
|
||||
{
|
||||
const HEVCSPS *sps = h->ps.sps;
|
||||
+ const HEVCPPS *pps = h->ps.pps;
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */
|
||||
*ctrl = (struct v4l2_ctrl_hevc_sps) {
|
||||
+ .video_parameter_set_id = sps->vps_id,
|
||||
+ .seq_parameter_set_id = pps->sps_id,
|
||||
.chroma_format_idc = sps->chroma_format_idc,
|
||||
.pic_width_in_luma_samples = sps->width,
|
||||
.pic_height_in_luma_samples = sps->height,
|
||||
@@ -300,6 +306,7 @@ static int v4l2_request_hevc_start_frame(AVCodecContext *avctx,
|
||||
const HEVCContext *h = avctx->priv_data;
|
||||
const HEVCSPS *sps = h->ps.sps;
|
||||
const HEVCPPS *pps = h->ps.pps;
|
||||
+ const SliceHeader *sh = &h->sh;
|
||||
const ScalingList *sl = pps->scaling_list_data_present_flag ?
|
||||
&pps->scaling_list :
|
||||
sps->scaling_list_enable_flag ?
|
||||
@@ -326,6 +333,9 @@ static int v4l2_request_hevc_start_frame(AVCodecContext *avctx,
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */
|
||||
controls->pps = (struct v4l2_ctrl_hevc_pps) {
|
||||
+ .pic_parameter_set_id = sh->pps_id,
|
||||
+ .num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active - 1,
|
||||
+ .num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active - 1,
|
||||
.num_extra_slice_header_bits = pps->num_extra_slice_header_bits,
|
||||
.init_qp_minus26 = pps->pic_init_qp_minus26,
|
||||
.diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth,
|
||||
@@ -442,6 +452,8 @@ static int v4l2_request_hevc_queue_decode(AVCodecContext *avctx, int last_slice)
|
||||
if (ctx->decode_mode == V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED)
|
||||
return ff_v4l2_request_decode_slice(avctx, h->ref->frame, control, FF_ARRAY_ELEMS(control), controls->first_slice, last_slice);
|
||||
|
||||
+ controls->sps.num_slices = controls->num_slices;
|
||||
+
|
||||
return ff_v4l2_request_decode_frame(avctx, h->ref->frame, control, FF_ARRAY_ELEMS(control));
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user