xref: /rockchip-linux_mpp/mpp/codec/dec/vp9/vp9d_parser2_syntax.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1 #include <string.h>
2 #include "vp9d_codec.h"
3 #include "vp9d_parser.h"
4 #include "vp9d_syntax.h"
5 
6 #define TRANS_TO_HW_STYLE(uv_mode)                          \
7 do{                                                         \
8     RK_U8 *uv_ptr = NULL;                                   \
9     RK_U8 uv_mode_prob[10][9];                              \
10     for (i = 0; i < 10; i++) {                              \
11         if (i == 0) {                                       \
12             uv_ptr = uv_mode[2];                            \
13         } else if ( i == 1) {                               \
14             uv_ptr = uv_mode[0];                            \
15         }  else if ( i == 2) {                              \
16             uv_ptr = uv_mode[1];                            \
17         }  else if ( i == 7) {                              \
18             uv_ptr = uv_mode[8];                            \
19         } else if (i == 8) {                                \
20             uv_ptr = uv_mode[7];                            \
21         } else {                                            \
22             uv_ptr = uv_mode[i];                            \
23         }                                                   \
24         memcpy(&uv_mode_prob[i], uv_ptr, 9);                \
25     }                                                       \
26     memcpy(uv_mode, uv_mode_prob, sizeof(uv_mode_prob));    \
27 }while(0)
28 
vp9d_fill_segmentation(VP9Context * s,DXVA_segmentation_VP9 * seg)29 static int vp9d_fill_segmentation(VP9Context *s, DXVA_segmentation_VP9 *seg)
30 {
31     int i;
32 
33     seg->enabled = s->segmentation.enabled;
34     seg->update_map = s->segmentation.update_map;
35     seg->temporal_update = s->segmentation.temporal;
36     seg->abs_delta = s->segmentation.absolute_vals;
37     seg->ReservedSegmentFlags4Bits = 0;
38 
39     for (i = 0; i < 7; i++) {
40         seg->tree_probs[i] = s->prob.seg[i];
41     }
42 
43     seg->pred_probs[0] = s->prob.segpred[0];
44     seg->pred_probs[1] = s->prob.segpred[1];
45     seg->pred_probs[2] = s->prob.segpred[2];
46 
47     for (i = 0; i < 8; i++) {
48         seg->feature_data[i][0] = s->segmentation.feat[i].q_val;
49         seg->feature_data[i][1] = s->segmentation.feat[i].lf_val;
50         seg->feature_data[i][2] = s->segmentation.feat[i].ref_val;
51         seg->feature_data[i][3] = s->segmentation.feat[i].skip_enabled;
52         seg->feature_mask[i] = s->segmentation.feat[i].q_enabled
53                                | (s->segmentation.feat[i].lf_enabled << 1)
54                                | (s->segmentation.feat[i].ref_enabled << 2)
55                                | (s->segmentation.feat[i].skip_enabled << 3);
56 #if 0
57         mpp_log("seg->feature_data[%d][0] = 0x%x", i, seg->feature_data[i][0]);
58 
59         mpp_log("seg->feature_data[%d][1] = 0x%x", i, seg->feature_data[i][0]);
60 
61         mpp_log("seg->feature_data[%d][2] = 0x%x", i, seg->feature_data[i][0]);
62 
63         mpp_log("seg->feature_data[%d][3] = 0x%x", i, seg->feature_data[i][0]);
64         mpp_log("seg->feature_mask[%d] = 0x%x", i, seg->feature_mask[i]);
65 #endif
66     }
67 
68     return 0;
69 }
70 
vp9d_fill_picparams(Vp9CodecContext * ctx,DXVA_PicParams_VP9 * pic)71 static int vp9d_fill_picparams(Vp9CodecContext *ctx, DXVA_PicParams_VP9 *pic)
72 {
73     VP9Context *s = ctx->priv_data;
74     RK_U8 partition_probs[16][3];
75     RK_U8 partition_probs_flag[16][3];
76     RK_U8 partition_probs_delata[16][3];
77     DXVA_prob_vp9* prob_flag = &pic->prob_flag_delta.p_flag;
78     DXVA_prob_vp9* prob_delta = &pic->prob_flag_delta.p_delta;
79     int i;
80 
81     pic->profile = ctx->profile;
82     pic->show_existing_frame = s->show_existing_frame;
83     pic->frame_type = !s->keyframe;
84     pic->show_frame = !s->invisible;
85     pic->error_resilient_mode =  s->errorres;
86     pic->subsampling_x = s->ss_h;
87     pic->subsampling_y = s->ss_v;
88     pic->extra_plane = s->extra_plane;
89     pic->refresh_frame_context = s->refreshctx;
90     pic->intra_only = s->intraonly;
91     pic->frame_context_idx = s->framectxid;
92     pic->reset_frame_context = s->resetctx;
93     pic->allow_high_precision_mv = s->highprecisionmvs;
94     pic->parallelmode = s->parallelmode;
95     pic->width = ctx->width;
96     pic->height = ctx->height;
97     pic->BitDepthMinus8Luma = s->bpp - 8;
98     pic->BitDepthMinus8Chroma = s->bpp - 8;
99     pic->interp_filter = s->filtermode;
100     pic->CurrPic.Index7Bits = s->frames[CUR_FRAME].slot_index;
101 
102     for (i = 0; i < 8; i++) {
103         pic->ref_frame_map[i].Index7Bits = s->refs[i].slot_index;
104         pic->ref_frame_coded_width[i] = mpp_frame_get_width(s->refs[i].f);
105         pic->ref_frame_coded_height[i] = mpp_frame_get_height(s->refs[i].f);
106     }
107     pic->frame_refs[0].Index7Bits =  s->refidx[0];
108     pic->frame_refs[1].Index7Bits =  s->refidx[1];
109     pic->frame_refs[2].Index7Bits =  s->refidx[2];
110     pic->ref_frame_sign_bias[1] = s->signbias[0];
111     pic->ref_frame_sign_bias[2] = s->signbias[1];
112     pic->ref_frame_sign_bias[3] = s->signbias[2];
113     pic->filter_level = s->filter.level;
114     pic->sharpness_level = s->filter.sharpness;
115     pic->mode_ref_delta_enabled = s->lf_delta.enabled;
116     pic->mode_ref_delta_update = s->lf_delta.update;
117     pic->use_prev_in_find_mv_refs = s->use_last_frame_mvs;
118     pic->ref_deltas[0] = s->lf_delta.ref[0];
119     pic->ref_deltas[1] = s->lf_delta.ref[1];
120     pic->ref_deltas[2] = s->lf_delta.ref[2];
121     pic->ref_deltas[3] = s->lf_delta.ref[3];
122     pic->mode_deltas[0] = s->lf_delta.mode[0];
123     pic->mode_deltas[1] = s->lf_delta.mode[1];
124     pic->base_qindex = s->yac_qi;
125     pic->y_dc_delta_q = s->ydc_qdelta;
126     pic->uv_dc_delta_q = s->uvdc_qdelta;
127     pic->uv_ac_delta_q = s->uvac_qdelta;
128     pic->txmode = s->txfmmode;
129     pic->refmode = s->comppredmode;
130     vp9d_fill_segmentation(s, &pic->stVP9Segments);
131     pic->log2_tile_cols = s->tiling.log2_tile_cols;
132     pic->log2_tile_rows = s->tiling.log2_tile_rows;
133     pic->first_partition_size = s->first_partition_size;
134     pic->uncompressed_header_size_byte_aligned = s->uncompress_head_size_in_byte;
135     memcpy(pic->mvscale, s->mvscale, sizeof(s->mvscale));
136     memcpy(&pic->prob, &s->prob, sizeof(pic->prob));
137     memcpy(&pic->prob_flag_delta, &s->prob_flag_delta, sizeof(pic->prob_flag_delta));
138     {
139         /*change partition to hardware need style*/
140         /*
141               hardware            syntax
142           *+++++8x8+++++*     *++++64x64++++*
143           *+++++16x16+++*     *++++32x32++++*
144           *+++++32x32+++*     *++++16x16++++*
145           *+++++64x64+++*     *++++8x8++++++*
146         */
147         RK_U32 m = 0;
148         RK_U32 len = sizeof(pic->prob.partition[0]);
149         RK_U32 step = len / sizeof(partition_probs[0]);
150 
151         for (i = MPP_ARRAY_ELEMS(pic->prob.partition) - 1; i >= 0; i--) {
152             memcpy(&partition_probs[m][0], &pic->prob.partition[i][0][0], len);
153             memcpy(&partition_probs_flag[m][0], &prob_flag->partition[i][0][0], len);
154             memcpy(&partition_probs_delata[m][0], &prob_delta->partition[i][0][0], len);
155             m += step;
156         }
157         memcpy(pic->prob.partition, partition_probs, sizeof(partition_probs));
158         memcpy(prob_flag->partition, partition_probs_flag, sizeof(partition_probs_flag));
159         memcpy(prob_delta->partition, partition_probs_delata, sizeof(partition_probs_delata));
160 
161         /*change uv_mode to hardware need style*/
162         /*
163             hardware              syntax
164          *+++++ dc  ++++*     *++++ v   ++++*
165          *+++++ v   ++++*     *++++ h   ++++*
166          *+++++ h   ++++*     *++++ dc  ++++*
167          *+++++ d45 ++++*     *++++ d45 ++++*
168          *+++++ d135++++*     *++++ d135++++*
169          *+++++ d117++++*     *++++ d117++++*
170          *+++++ d153++++*     *++++ d153++++*
171          *+++++ d207++++*     *++++ d63 ++++*
172          *+++++ d63 ++++*     *++++ d207++++*
173          *+++++ tm  ++++*     *++++ tm  ++++*
174         */
175 
176         TRANS_TO_HW_STYLE(pic->prob.uv_mode);
177         TRANS_TO_HW_STYLE(prob_flag->uv_mode);
178         TRANS_TO_HW_STYLE(prob_delta->uv_mode);
179     }
180     return 0;
181 }
182 
vp9d_fill_counts(Vp9CodecContext * ctx)183 void vp9d_fill_counts(Vp9CodecContext *ctx)
184 {
185     VP9Context *s = ctx->priv_data;
186     memcpy(&ctx->pic_params.counts, &s->counts, sizeof(s->counts));
187 }
188 
vp9d_parser2_syntax(Vp9CodecContext * ctx)189 RK_S32 vp9d_parser2_syntax(Vp9CodecContext *ctx)
190 {
191     vp9d_fill_picparams(ctx, &ctx->pic_params);
192     return 0;
193 }
194