/src/libmpeg2/decoder/impeg2d_i_pic.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2015 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | |
21 | | #include "iv_datatypedef.h" |
22 | | #include "iv.h" |
23 | | |
24 | | #include "impeg2_buf_mgr.h" |
25 | | #include "impeg2_disp_mgr.h" |
26 | | #include "impeg2_defs.h" |
27 | | #include "impeg2_platform_macros.h" |
28 | | #include "impeg2_inter_pred.h" |
29 | | #include "impeg2_idct.h" |
30 | | #include "impeg2_globals.h" |
31 | | #include "impeg2_mem_func.h" |
32 | | #include "impeg2_format_conv.h" |
33 | | #include "impeg2_macros.h" |
34 | | |
35 | | #include "ivd.h" |
36 | | #include "impeg2d.h" |
37 | | #include "impeg2d_bitstream.h" |
38 | | #include "impeg2d_structs.h" |
39 | | #include "impeg2d_vld_tables.h" |
40 | | #include "impeg2d_vld.h" |
41 | | #include "impeg2d_pic_proc.h" |
42 | | #include "impeg2d_debug.h" |
43 | | #include "impeg2d_globals.h" |
44 | | #include "impeg2d_mv_dec.h" |
45 | | |
46 | | /******************************************************************************* |
47 | | * Function Name : impeg2d_dec_i_mb_params |
48 | | * |
49 | | * Description : Decoding I MB parameters. |
50 | | * |
51 | | * Arguments : |
52 | | * dec : Decoder state |
53 | | * stream : Bitstream |
54 | | * |
55 | | * Values Returned : None |
56 | | *******************************************************************************/ |
57 | | void impeg2d_dec_i_mb_params(dec_state_t *ps_dec) |
58 | 322k | { |
59 | | |
60 | 322k | UWORD16 u2_next_bits; |
61 | 322k | UWORD16 u2_bits_to_flush; |
62 | 322k | stream_t *ps_stream = &ps_dec->s_bit_stream; |
63 | | |
64 | | /*-----------------------------------------------------------------------*/ |
65 | | /* Flush the MBAddrIncr Bit */ |
66 | | /* */ |
67 | | /* Since we are not supporting scalable modes there won't be skipped */ |
68 | | /* macroblocks in I-Picture and the MBAddrIncr will always be 1, */ |
69 | | /* The MBAddrIncr can never be greater than 1 for the simple and main */ |
70 | | /* profile MPEG2. */ |
71 | | /*-----------------------------------------------------------------------*/ |
72 | 322k | if(impeg2d_bit_stream_nxt(ps_stream,1) == 1) //Making sure the increment is one. |
73 | 299k | { |
74 | 299k | impeg2d_bit_stream_flush(ps_stream,1); |
75 | 299k | } |
76 | 23.4k | else if(ps_dec->u2_first_mb && ps_dec->u2_mb_x) |
77 | 1.06k | { |
78 | 1.06k | WORD32 i4_mb_add_inc = impeg2d_get_mb_addr_incr(ps_stream); |
79 | | |
80 | | //VOLParams->FirstInSlice = 0; |
81 | | /****************************************************************/ |
82 | | /* Section 6.3.17 */ |
83 | | /* The first MB of a slice cannot be skipped */ |
84 | | /* But the mb_addr_incr can be > 1, because at the beginning of */ |
85 | | /* a slice, it indicates the offset from the last MB in the */ |
86 | | /* previous row. Hence for the first slice in a row, the */ |
87 | | /* mb_addr_incr needs to be 1. */ |
88 | | /****************************************************************/ |
89 | | /* MB_x is set to zero whenever MB_y changes. */ |
90 | | |
91 | 1.06k | ps_dec->u2_mb_x = i4_mb_add_inc - 1; |
92 | 1.06k | ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1)); |
93 | 1.06k | } |
94 | | |
95 | | /*-----------------------------------------------------------------------*/ |
96 | | /* Decode the macroblock_type, dct_type and quantiser_scale_code */ |
97 | | /* */ |
98 | | /* macroblock_type 2 bits [can be either 1 or 01] */ |
99 | | /* dct_type 1 bit */ |
100 | | /* quantiser_scale_code 5 bits */ |
101 | | /*-----------------------------------------------------------------------*/ |
102 | 322k | u2_next_bits = impeg2d_bit_stream_nxt(ps_stream,8); |
103 | 322k | if(BIT(u2_next_bits,7) == 1) |
104 | 251k | { |
105 | | /* read the dct_type if needed */ |
106 | 251k | u2_bits_to_flush = 1; |
107 | 251k | if(ps_dec->u2_read_dct_type) |
108 | 2.10k | { |
109 | 2.10k | u2_bits_to_flush++; |
110 | 2.10k | ps_dec->u2_field_dct = BIT(u2_next_bits,6); |
111 | 2.10k | } |
112 | 251k | } |
113 | 71.1k | else |
114 | 71.1k | { |
115 | 71.1k | u2_bits_to_flush = 7; |
116 | | /*------------------------------------------------------------------*/ |
117 | | /* read the dct_type if needed */ |
118 | | /*------------------------------------------------------------------*/ |
119 | 71.1k | if(ps_dec->u2_read_dct_type) |
120 | 977 | { |
121 | 977 | u2_bits_to_flush++; |
122 | 977 | ps_dec->u2_field_dct = BIT(u2_next_bits,5); |
123 | 977 | } |
124 | 70.1k | else |
125 | 70.1k | { |
126 | 70.1k | u2_next_bits >>= 1; |
127 | 70.1k | } |
128 | | /*------------------------------------------------------------------*/ |
129 | | /* Quant scale code decoding */ |
130 | | /*------------------------------------------------------------------*/ |
131 | 71.1k | { |
132 | 71.1k | UWORD16 quant_scale_code; |
133 | 71.1k | quant_scale_code = u2_next_bits & 0x1F; |
134 | | |
135 | 71.1k | ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ? |
136 | 21.2k | gau1_impeg2_non_linear_quant_scale[quant_scale_code] : |
137 | 71.1k | (quant_scale_code << 1); |
138 | 71.1k | } |
139 | 71.1k | } |
140 | 322k | impeg2d_bit_stream_flush(ps_stream,u2_bits_to_flush); |
141 | | /*************************************************************************/ |
142 | | /* Decoding of motion vectors if concealment motion vectors are present */ |
143 | | /*************************************************************************/ |
144 | 322k | if(ps_dec->u2_concealment_motion_vectors) |
145 | 26.2k | { |
146 | 26.2k | if(ps_dec->u2_picture_structure != FRAME_PICTURE) |
147 | 24.2k | impeg2d_bit_stream_flush(ps_stream,1); |
148 | 26.2k | impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[FORW][FIRST],ps_dec->ai2_mv[FORW][FIRST], |
149 | 26.2k | ps_dec->au2_f_code[FORW],0,0); |
150 | | |
151 | | /* Flush the marker bit */ |
152 | 26.2k | if(0 == (impeg2d_bit_stream_get(ps_stream,1))) |
153 | 12.1k | { |
154 | | /* Ignore marker bit error */ |
155 | 12.1k | } |
156 | | |
157 | 26.2k | } |
158 | 322k | ps_dec->u2_first_mb = 0; |
159 | 322k | return; |
160 | 322k | } |
161 | | /******************************************************************************* |
162 | | * Function Name : impeg2d_dec_i_slice |
163 | | * |
164 | | * Description : Decodes I slice |
165 | | * |
166 | | * Arguments : |
167 | | * dec : Decoder state |
168 | | * |
169 | | * Values Returned : None |
170 | | *******************************************************************************/ |
171 | | IMPEG2D_ERROR_CODES_T impeg2d_dec_i_slice(dec_state_t *ps_dec) |
172 | 9.04k | { |
173 | 9.04k | WORD16 *pi2_vld_out; |
174 | 9.04k | UWORD32 i; |
175 | 9.04k | yuv_buf_t *ps_cur_frm_buf = &ps_dec->s_cur_frm_buf; |
176 | | |
177 | 9.04k | UWORD32 u4_frame_width = ps_dec->u2_frame_width; |
178 | 9.04k | UWORD32 u4_frm_offset = 0; |
179 | 9.04k | UWORD8 *pu1_out_p; |
180 | 9.04k | IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE; |
181 | | |
182 | | |
183 | 9.04k | pi2_vld_out = ps_dec->ai2_vld_buf; |
184 | | |
185 | | |
186 | 9.04k | if(ps_dec->u2_picture_structure != FRAME_PICTURE) |
187 | 3.04k | { |
188 | 3.04k | u4_frame_width <<= 1; |
189 | 3.04k | if(ps_dec->u2_picture_structure == BOTTOM_FIELD) |
190 | 262 | { |
191 | 262 | u4_frm_offset = ps_dec->u2_frame_width; |
192 | 262 | } |
193 | 3.04k | } |
194 | | |
195 | 9.04k | do |
196 | 322k | { |
197 | 322k | UWORD32 u4_x_offset,u4_y_offset; |
198 | 322k | UWORD32 u4_blk_pos; |
199 | 322k | UWORD32 u4_x_dst_offset = 0; |
200 | 322k | UWORD32 u4_y_dst_offset = 0; |
201 | | |
202 | | |
203 | 322k | IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y); |
204 | | |
205 | 322k | impeg2d_dec_i_mb_params(ps_dec); |
206 | | |
207 | 322k | u4_x_dst_offset = u4_frm_offset + (ps_dec->u2_mb_x << 4); |
208 | 322k | u4_y_dst_offset = (ps_dec->u2_mb_y << 4) * u4_frame_width; |
209 | 322k | pu1_out_p = ps_cur_frm_buf->pu1_y + u4_x_dst_offset + u4_y_dst_offset; |
210 | | |
211 | 1.59M | for(i = 0; i < NUM_LUMA_BLKS; ++i) |
212 | 1.27M | { |
213 | | |
214 | 1.27M | e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, |
215 | 1.27M | ps_dec->pu1_inv_scan_matrix, 1, Y_LUMA, 0); |
216 | 1.27M | if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) |
217 | 3.52k | { |
218 | 3.52k | return e_error; |
219 | 3.52k | } |
220 | | |
221 | 1.26M | u4_x_offset = gai2_impeg2_blk_x_off[i]; |
222 | | |
223 | 1.26M | if(ps_dec->u2_field_dct == 0) |
224 | 1.27M | u4_y_offset = gai2_impeg2_blk_y_off_frm[i] ; |
225 | 18.4E | else |
226 | 18.4E | u4_y_offset = gai2_impeg2_blk_y_off_fld[i] ; |
227 | | |
228 | 1.26M | u4_blk_pos = u4_y_offset * u4_frame_width + u4_x_offset; |
229 | 1.26M | IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); |
230 | | |
231 | 1.26M | PROFILE_DISABLE_IDCT_IF0 |
232 | 1.26M | { |
233 | 1.26M | WORD32 i4_idx; |
234 | 1.26M | i4_idx = 1; |
235 | 1.26M | if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) |
236 | 333k | i4_idx = 0; |
237 | | |
238 | 1.26M | ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, |
239 | 1.26M | ps_dec->ai2_idct_stg1, |
240 | 1.26M | (UWORD8 *)gau1_impeg2_zerobuf, |
241 | 1.26M | pu1_out_p + u4_blk_pos, |
242 | 1.26M | 8, |
243 | 1.26M | 8, |
244 | 1.26M | u4_frame_width << ps_dec->u2_field_dct, |
245 | 1.26M | ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); |
246 | | |
247 | 1.26M | } |
248 | | |
249 | 1.26M | } |
250 | | |
251 | | /* For U and V blocks, divide the x and y offsets by 2. */ |
252 | 319k | u4_x_dst_offset >>= 1; |
253 | 319k | u4_y_dst_offset >>= 2; |
254 | | |
255 | | /* In case of chrominance blocks the DCT will be frame DCT */ |
256 | | /* i = 0, U component and */ |
257 | | |
258 | 319k | e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, |
259 | 319k | ps_dec->pu1_inv_scan_matrix, 1, U_CHROMA, 0); |
260 | 319k | if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) |
261 | 958 | { |
262 | 958 | return e_error; |
263 | 958 | } |
264 | | |
265 | 318k | pu1_out_p = ps_cur_frm_buf->pu1_u + u4_x_dst_offset + u4_y_dst_offset; |
266 | 318k | IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); |
267 | 318k | PROFILE_DISABLE_IDCT_IF0 |
268 | 318k | { |
269 | 318k | WORD32 i4_idx; |
270 | 318k | i4_idx = 1; |
271 | 318k | if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) |
272 | 256k | i4_idx = 0; |
273 | | |
274 | 318k | ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, |
275 | 318k | ps_dec->ai2_idct_stg1, |
276 | 318k | (UWORD8 *)gau1_impeg2_zerobuf, |
277 | 318k | pu1_out_p, |
278 | 318k | 8, |
279 | 318k | 8, |
280 | 318k | u4_frame_width >> 1, |
281 | 318k | ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); |
282 | | |
283 | 318k | } |
284 | | /* Write the idct_out block to the current frame dec->curFrame*/ |
285 | | /* In case of field DCT type, write to alternate lines */ |
286 | 318k | e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, |
287 | 318k | ps_dec->pu1_inv_scan_matrix, 1, V_CHROMA, 0); |
288 | 318k | if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) |
289 | 976 | { |
290 | 976 | return e_error; |
291 | 976 | } |
292 | | |
293 | 317k | pu1_out_p = ps_cur_frm_buf->pu1_v + u4_x_dst_offset + u4_y_dst_offset; |
294 | 317k | IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); |
295 | 317k | PROFILE_DISABLE_IDCT_IF0 |
296 | 317k | { |
297 | 317k | WORD32 i4_idx; |
298 | 317k | i4_idx = 1; |
299 | 317k | if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) |
300 | 274k | i4_idx = 0; |
301 | 317k | ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, |
302 | 317k | ps_dec->ai2_idct_stg1, |
303 | 317k | (UWORD8 *)gau1_impeg2_zerobuf, |
304 | 317k | pu1_out_p, |
305 | 317k | 8, |
306 | 317k | 8, |
307 | 317k | u4_frame_width >> 1, |
308 | 317k | ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); |
309 | 317k | } |
310 | 317k | ps_dec->u2_num_mbs_left--; |
311 | | |
312 | | |
313 | 317k | ps_dec->u2_mb_x++; |
314 | | |
315 | 317k | if(ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset) |
316 | 699 | { |
317 | 699 | return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR; |
318 | 699 | } |
319 | 316k | else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) |
320 | 8.98k | { |
321 | 8.98k | ps_dec->u2_mb_x = 0; |
322 | 8.98k | ps_dec->u2_mb_y++; |
323 | 8.98k | } |
324 | | |
325 | 317k | } |
326 | 316k | while(ps_dec->u2_num_mbs_left != 0 && impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,23) != 0x0); |
327 | 2.88k | return e_error; |
328 | 9.04k | } |