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