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