/src/libmpeg2/decoder/impeg2d_pic_proc.c
Line | Count | Source (jump to first uncovered line) |
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 | | #include <stdio.h> |
21 | | #include <string.h> |
22 | | |
23 | | #include "iv_datatypedef.h" |
24 | | #include "iv.h" |
25 | | |
26 | | #include "impeg2_buf_mgr.h" |
27 | | #include "impeg2_disp_mgr.h" |
28 | | #include "impeg2_defs.h" |
29 | | #include "impeg2_platform_macros.h" |
30 | | #include "impeg2_inter_pred.h" |
31 | | #include "impeg2_idct.h" |
32 | | #include "impeg2_globals.h" |
33 | | #include "impeg2_mem_func.h" |
34 | | #include "impeg2_format_conv.h" |
35 | | #include "impeg2_macros.h" |
36 | | |
37 | | #include "ivd.h" |
38 | | #include "impeg2d.h" |
39 | | #include "impeg2d_bitstream.h" |
40 | | #include "impeg2d_structs.h" |
41 | | #include "impeg2d_globals.h" |
42 | | #include "impeg2d_vld_tables.h" |
43 | | #include "impeg2d_vld.h" |
44 | | #include "impeg2d_pic_proc.h" |
45 | | #include "impeg2d_debug.h" |
46 | | |
47 | | void impeg2d_init_function_ptr(void *pv_codec); |
48 | | void impeg2d_format_convert(dec_state_t *ps_dec, |
49 | | pic_buf_t *ps_src_pic, |
50 | | iv_yuv_buf_t *ps_disp_frm_buf, |
51 | | UWORD32 u4_start_row, UWORD32 u4_num_rows) |
52 | 128k | { |
53 | 128k | UWORD8 *pu1_src_y,*pu1_src_u,*pu1_src_v; |
54 | 128k | UWORD8 *pu1_dst_y,*pu1_dst_u,*pu1_dst_v; |
55 | | |
56 | | |
57 | | |
58 | 128k | if((NULL == ps_src_pic) || (NULL == ps_src_pic->pu1_y) || (0 == u4_num_rows)) |
59 | 0 | return; |
60 | | |
61 | 128k | pu1_src_y = ps_src_pic->pu1_y + (u4_start_row * ps_dec->u2_frame_width); |
62 | 128k | pu1_src_u = ps_src_pic->pu1_u + ((u4_start_row >> 1) * (ps_dec->u2_frame_width >> 1)); |
63 | 128k | pu1_src_v = ps_src_pic->pu1_v + ((u4_start_row >> 1) *(ps_dec->u2_frame_width >> 1)); |
64 | | |
65 | 128k | pu1_dst_y = (UWORD8 *)ps_disp_frm_buf->pv_y_buf + (u4_start_row * ps_dec->u4_frm_buf_stride); |
66 | 128k | pu1_dst_u = (UWORD8 *)ps_disp_frm_buf->pv_u_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride >> 1)); |
67 | 128k | pu1_dst_v = (UWORD8 *)ps_disp_frm_buf->pv_v_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride >> 1)); |
68 | | |
69 | 128k | if (IV_YUV_420P == ps_dec->i4_chromaFormat) |
70 | 30.4k | { |
71 | 30.4k | ps_dec->pf_copy_yuv420p_buf(pu1_src_y, pu1_src_u, pu1_src_v, pu1_dst_y, |
72 | 30.4k | pu1_dst_u, pu1_dst_v, |
73 | 30.4k | ps_dec->u2_horizontal_size, |
74 | 30.4k | u4_num_rows, |
75 | 30.4k | ps_dec->u2_frame_width, |
76 | 30.4k | (ps_dec->u2_frame_width >> 1), |
77 | 30.4k | (ps_dec->u2_frame_width >> 1), |
78 | 30.4k | ps_dec->u4_frm_buf_stride, |
79 | 30.4k | (ps_dec->u4_frm_buf_stride >> 1), |
80 | 30.4k | (ps_dec->u4_frm_buf_stride >> 1)); |
81 | 30.4k | } |
82 | 98.2k | else if (IV_YUV_422ILE == ps_dec->i4_chromaFormat) |
83 | 0 | { |
84 | 0 | void *pv_yuv422i; |
85 | 0 | UWORD32 u2_height,u2_width,u2_stride_y,u2_stride_u,u2_stride_v; |
86 | 0 | UWORD32 u2_stride_yuv422i; |
87 | | |
88 | |
|
89 | 0 | pv_yuv422i = (UWORD8 *)ps_disp_frm_buf->pv_y_buf + ((ps_dec->u2_vertical_size)*(ps_dec->u4_frm_buf_stride)); |
90 | 0 | u2_height = u4_num_rows; |
91 | 0 | u2_width = ps_dec->u2_horizontal_size; |
92 | 0 | u2_stride_y = ps_dec->u2_frame_width; |
93 | 0 | u2_stride_u = u2_stride_y >> 1; |
94 | 0 | u2_stride_v = u2_stride_u; |
95 | 0 | u2_stride_yuv422i = (0 == ps_dec->u4_frm_buf_stride) ? ps_dec->u2_horizontal_size : ps_dec->u4_frm_buf_stride; |
96 | |
|
97 | 0 | ps_dec->pf_fmt_conv_yuv420p_to_yuv422ile(pu1_src_y, |
98 | 0 | pu1_src_u, |
99 | 0 | pu1_src_v, |
100 | 0 | pv_yuv422i, |
101 | 0 | u2_width, |
102 | 0 | u2_height, |
103 | 0 | u2_stride_y, |
104 | 0 | u2_stride_u, |
105 | 0 | u2_stride_v, |
106 | 0 | u2_stride_yuv422i); |
107 | |
|
108 | 0 | } |
109 | 98.2k | else if((ps_dec->i4_chromaFormat == IV_YUV_420SP_UV) || |
110 | 98.2k | (ps_dec->i4_chromaFormat == IV_YUV_420SP_VU)) |
111 | 98.2k | { |
112 | | |
113 | 98.2k | UWORD32 dest_inc_Y=0,dest_inc_UV=0; |
114 | 98.2k | WORD32 convert_uv_only; |
115 | | |
116 | 98.2k | pu1_dst_u = (UWORD8 *)ps_disp_frm_buf->pv_u_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride)); |
117 | 98.2k | dest_inc_Y = ps_dec->u4_frm_buf_stride; |
118 | 98.2k | dest_inc_UV = ((ps_dec->u4_frm_buf_stride + 1) >> 1) << 1; |
119 | 98.2k | convert_uv_only = 0; |
120 | | |
121 | 98.2k | if(1 == ps_dec->u4_share_disp_buf) |
122 | 0 | convert_uv_only = 1; |
123 | | |
124 | 98.2k | if(ps_src_pic->pu1_y == ps_disp_frm_buf->pv_y_buf) |
125 | 41.1k | convert_uv_only = 1; |
126 | | |
127 | 98.2k | if(ps_dec->i4_chromaFormat == IV_YUV_420SP_UV) |
128 | 64.2k | { |
129 | 64.2k | ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_uv(pu1_src_y, |
130 | 64.2k | pu1_src_u, |
131 | 64.2k | pu1_src_v, |
132 | 64.2k | pu1_dst_y, |
133 | 64.2k | pu1_dst_u, |
134 | 64.2k | u4_num_rows, |
135 | 64.2k | ps_dec->u2_horizontal_size, |
136 | 64.2k | ps_dec->u2_frame_width, |
137 | 64.2k | ps_dec->u2_frame_width >> 1, |
138 | 64.2k | ps_dec->u2_frame_width >> 1, |
139 | 64.2k | dest_inc_Y, |
140 | 64.2k | dest_inc_UV, |
141 | 64.2k | convert_uv_only); |
142 | 64.2k | } |
143 | 33.9k | else |
144 | 33.9k | { |
145 | 33.9k | ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_vu(pu1_src_y, |
146 | 33.9k | pu1_src_u, |
147 | 33.9k | pu1_src_v, |
148 | 33.9k | pu1_dst_y, |
149 | 33.9k | pu1_dst_u, |
150 | 33.9k | u4_num_rows, |
151 | 33.9k | ps_dec->u2_horizontal_size, |
152 | 33.9k | ps_dec->u2_frame_width, |
153 | 33.9k | ps_dec->u2_frame_width >> 1, |
154 | 33.9k | ps_dec->u2_frame_width >> 1, |
155 | 33.9k | dest_inc_Y, |
156 | 33.9k | dest_inc_UV, |
157 | 33.9k | convert_uv_only); |
158 | 33.9k | } |
159 | | |
160 | | |
161 | | |
162 | 98.2k | } |
163 | | |
164 | 128k | } |
165 | | |
166 | | |
167 | | /******************************************************************************* |
168 | | * |
169 | | * Function Name : impeg2d_get_frm_buf |
170 | | * |
171 | | * Description : Gets YUV component buffers for the frame |
172 | | * |
173 | | * Arguments : |
174 | | * frm_buf : YUV buffer |
175 | | * frm : Reference frame |
176 | | * width : Width of the frame |
177 | | * Height : Height of the frame |
178 | | * |
179 | | * Values Returned : None |
180 | | *******************************************************************************/ |
181 | | void impeg2d_get_frm_buf(yuv_buf_t *ps_frm_buf,UWORD8 *pu1_frm,UWORD32 u4_width,UWORD32 u4_height) |
182 | 0 | { |
183 | 0 | UWORD32 u4_luma_size = u4_width * u4_height; |
184 | 0 | UWORD32 u4_chroma_size = (u4_width * u4_height)>>2; |
185 | |
|
186 | 0 | ps_frm_buf->pu1_y = pu1_frm; |
187 | 0 | ps_frm_buf->pu1_u = pu1_frm + u4_luma_size; |
188 | 0 | ps_frm_buf->pu1_v = pu1_frm + u4_luma_size + u4_chroma_size; |
189 | |
|
190 | 0 | } |
191 | | /******************************************************************************* |
192 | | * |
193 | | * Function Name : impeg2d_get_bottom_field_buf |
194 | | * |
195 | | * Description : Gets YUV component buffers for bottom field of the frame |
196 | | * |
197 | | * Arguments : |
198 | | * frm_buf : YUV buffer |
199 | | * frm : Reference frame |
200 | | * width : Width of the frame |
201 | | * Height : Height of the frame |
202 | | * |
203 | | * Values Returned : None |
204 | | *******************************************************************************/ |
205 | | void impeg2d_get_bottom_field_buf(yuv_buf_t *ps_src_buf,yuv_buf_t *ps_dst_buf, |
206 | | UWORD32 u4_width) |
207 | 16.6k | { |
208 | 16.6k | ps_dst_buf->pu1_y = ps_src_buf->pu1_y + u4_width; |
209 | 16.6k | ps_dst_buf->pu1_u = ps_src_buf->pu1_u + (u4_width>>1); |
210 | 16.6k | ps_dst_buf->pu1_v = ps_src_buf->pu1_v + (u4_width>>1); |
211 | | |
212 | 16.6k | } |
213 | | /******************************************************************************* |
214 | | * Function Name : impeg2d_get_mb_addr_incr |
215 | | * |
216 | | * Description : Decodes the Macroblock address increment |
217 | | * |
218 | | * Arguments : |
219 | | * stream : Bitstream |
220 | | * |
221 | | * Values Returned : Macroblock address increment |
222 | | *******************************************************************************/ |
223 | | UWORD16 impeg2d_get_mb_addr_incr(stream_t *ps_stream) |
224 | 2.62M | { |
225 | 2.62M | UWORD16 u2_mb_addr_incr = 0; |
226 | 2.85M | while (impeg2d_bit_stream_nxt(ps_stream,MB_ESCAPE_CODE_LEN) == MB_ESCAPE_CODE && |
227 | 2.85M | ps_stream->u4_offset < ps_stream->u4_max_offset) |
228 | 222k | { |
229 | 222k | impeg2d_bit_stream_flush(ps_stream,MB_ESCAPE_CODE_LEN); |
230 | 222k | u2_mb_addr_incr += 33; |
231 | 222k | } |
232 | 2.62M | u2_mb_addr_incr += impeg2d_dec_vld_symbol(ps_stream,gai2_impeg2d_mb_addr_incr,MB_ADDR_INCR_LEN) + |
233 | 2.62M | MB_ADDR_INCR_OFFSET; |
234 | 2.62M | return(u2_mb_addr_incr); |
235 | 2.62M | } |
236 | | |
237 | | /******************************************************************************* |
238 | | * |
239 | | * Function Name : impeg2d_init_video_state |
240 | | * |
241 | | * Description : Initializes the Video decoder state |
242 | | * |
243 | | * Arguments : |
244 | | * dec : Decoder context |
245 | | * videoType : MPEG_2_Video / MPEG_1_Video |
246 | | * |
247 | | * Values Returned : None |
248 | | *******************************************************************************/ |
249 | | IMPEG2D_ERROR_CODES_T impeg2d_init_video_state(dec_state_t *ps_dec, e_video_type_t e_video_type) |
250 | 9.11k | { |
251 | | /*-----------------------------------------------------------------------*/ |
252 | | /* Bit Stream that conforms to MPEG-1 <ISO/IEC 11172-2> standard */ |
253 | | /*-----------------------------------------------------------------------*/ |
254 | 9.11k | if(e_video_type == MPEG_1_VIDEO) |
255 | 5.88k | { |
256 | 5.88k | ps_dec->u2_is_mpeg2 = 0; |
257 | | |
258 | | /*-------------------------------------------------------------------*/ |
259 | | /* force MPEG-1 parameters for proper decoder behavior */ |
260 | | /* see ISO/IEC 13818-2 section D.9.14 */ |
261 | | /*-------------------------------------------------------------------*/ |
262 | 5.88k | ps_dec->u2_progressive_sequence = 1; |
263 | 5.88k | ps_dec->u2_intra_dc_precision = 0; |
264 | 5.88k | ps_dec->u2_picture_structure = FRAME_PICTURE; |
265 | 5.88k | ps_dec->u2_frame_pred_frame_dct = 1; |
266 | 5.88k | ps_dec->u2_concealment_motion_vectors = 0; |
267 | 5.88k | ps_dec->u2_q_scale_type = 0; |
268 | 5.88k | ps_dec->u2_intra_vlc_format = 0; |
269 | 5.88k | ps_dec->u2_alternate_scan = 0; |
270 | 5.88k | ps_dec->u2_repeat_first_field = 0; |
271 | 5.88k | ps_dec->u2_progressive_frame = 1; |
272 | 5.88k | ps_dec->u2_frame_rate_extension_n = 0; |
273 | 5.88k | ps_dec->u2_frame_rate_extension_d = 0; |
274 | 5.88k | ps_dec->u2_forw_f_code = 7; |
275 | 5.88k | ps_dec->u2_back_f_code = 7; |
276 | | |
277 | 5.88k | ps_dec->pf_vld_inv_quant = impeg2d_vld_inv_quant_mpeg1; |
278 | | /*-------------------------------------------------------------------*/ |
279 | | /* Setting of parameters other than those mentioned in MPEG2 standard*/ |
280 | | /* but used in decoding process. */ |
281 | | /*-------------------------------------------------------------------*/ |
282 | 5.88k | } |
283 | | /*-----------------------------------------------------------------------*/ |
284 | | /* Bit Stream that conforms to MPEG-2 */ |
285 | | /*-----------------------------------------------------------------------*/ |
286 | 3.23k | else |
287 | 3.23k | { |
288 | 3.23k | ps_dec->u2_is_mpeg2 = 1; |
289 | 3.23k | ps_dec->u2_full_pel_forw_vector = 0; |
290 | 3.23k | ps_dec->u2_forw_f_code = 7; |
291 | 3.23k | ps_dec->u2_full_pel_back_vector = 0; |
292 | 3.23k | ps_dec->u2_back_f_code = 7; |
293 | 3.23k | ps_dec->pf_vld_inv_quant = impeg2d_vld_inv_quant_mpeg2; |
294 | | |
295 | | |
296 | 3.23k | } |
297 | | |
298 | | |
299 | 9.11k | impeg2d_init_function_ptr(ps_dec); |
300 | | |
301 | | /* Set the frame Width and frame Height */ |
302 | 9.11k | ps_dec->u2_frame_height = ALIGN16(ps_dec->u2_vertical_size); |
303 | 9.11k | ps_dec->u2_frame_width = ALIGN16(ps_dec->u2_horizontal_size); |
304 | 9.11k | ps_dec->u2_num_horiz_mb = (ps_dec->u2_horizontal_size + 15) >> 4; |
305 | | // dec->u4_frm_buf_stride = dec->frameWidth; |
306 | 9.11k | if (ps_dec->u2_frame_height > ps_dec->u2_create_max_height || ps_dec->u2_frame_width > ps_dec->u2_create_max_width) |
307 | 0 | { |
308 | 0 | return IMPEG2D_PIC_SIZE_NOT_SUPPORTED; |
309 | 0 | } |
310 | | |
311 | 9.11k | ps_dec->u2_num_flds_decoded = 0; |
312 | | |
313 | | /* Calculate the frame period */ |
314 | 9.11k | { |
315 | 9.11k | UWORD32 numer; |
316 | 9.11k | UWORD32 denom; |
317 | 9.11k | numer = (UWORD32)gau2_impeg2_frm_rate_code[ps_dec->u2_frame_rate_code][1] * |
318 | 9.11k | (UWORD32)(ps_dec->u2_frame_rate_extension_d + 1); |
319 | | |
320 | 9.11k | denom = (UWORD32)gau2_impeg2_frm_rate_code[ps_dec->u2_frame_rate_code][0] * |
321 | 9.11k | (UWORD32)(ps_dec->u2_frame_rate_extension_n + 1); |
322 | 9.11k | ps_dec->u2_framePeriod = (numer * 1000 * 100) / denom; |
323 | 9.11k | } |
324 | | |
325 | | |
326 | 9.11k | if(VERTICAL_SCAN == ps_dec->u2_alternate_scan) |
327 | 130 | { |
328 | 130 | ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_vertical; |
329 | 130 | } |
330 | 8.98k | else |
331 | 8.98k | { |
332 | 8.98k | ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_zig_zag; |
333 | 8.98k | } |
334 | 9.11k | return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE; |
335 | 9.11k | } |
336 | | /******************************************************************************* |
337 | | * |
338 | | * Function Name : impeg2d_pre_pic_dec_proc |
339 | | * |
340 | | * Description : Does the processing neccessary before picture decoding |
341 | | * |
342 | | * Arguments : |
343 | | * dec : Decoder context |
344 | | * |
345 | | * Values Returned : None |
346 | | *******************************************************************************/ |
347 | | IMPEG2D_ERROR_CODES_T impeg2d_pre_pic_dec_proc(dec_state_t *ps_dec) |
348 | 21.0k | { |
349 | 21.0k | WORD32 u4_get_disp; |
350 | 21.0k | pic_buf_t *ps_disp_pic; |
351 | 21.0k | IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE; |
352 | | |
353 | 21.0k | u4_get_disp = 0; |
354 | 21.0k | ps_disp_pic = NULL; |
355 | | |
356 | | /* Field Picture */ |
357 | 21.0k | if(ps_dec->u2_picture_structure != FRAME_PICTURE) |
358 | 3.14k | { |
359 | 3.14k | ps_dec->u2_num_vert_mb = (ps_dec->u2_vertical_size + 31) >> 5; |
360 | | |
361 | 3.14k | if(ps_dec->u2_num_flds_decoded == 0) |
362 | 2.31k | { |
363 | 2.31k | pic_buf_t *ps_pic_buf; |
364 | 2.31k | u4_get_disp = 1; |
365 | | |
366 | 2.31k | ps_pic_buf = impeg2_buf_mgr_get_next_free(ps_dec->pv_pic_buf_mg, &ps_dec->i4_cur_buf_id); |
367 | | |
368 | 2.31k | if (NULL == ps_pic_buf) |
369 | 350 | { |
370 | 350 | return IMPEG2D_NO_FREE_BUF_ERR; |
371 | 350 | } |
372 | | |
373 | 1.96k | impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_DISP); |
374 | 1.96k | impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF); |
375 | 1.96k | if(ps_dec->u4_deinterlace) |
376 | 1.96k | impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, MPEG2_BUF_MGR_DEINT); |
377 | | |
378 | 1.96k | ps_pic_buf->e_pic_type = ps_dec->e_pic_type; |
379 | 1.96k | ps_dec->ps_cur_pic = ps_pic_buf; |
380 | 1.96k | ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y; |
381 | 1.96k | ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u; |
382 | 1.96k | ps_dec->s_cur_frm_buf.pu1_v = ps_pic_buf->pu1_v; |
383 | 1.96k | } |
384 | 836 | else |
385 | 836 | { |
386 | | /* Timestamp associated with second field is associated with the current picture */ |
387 | 836 | ps_dec->ps_cur_pic->u4_ts = ps_dec->u4_inp_ts; |
388 | 836 | } |
389 | | |
390 | 2.79k | if(ps_dec->u2_picture_structure == TOP_FIELD) |
391 | 1.79k | { |
392 | 1.79k | ps_dec->u2_fld_parity = TOP; |
393 | 1.79k | } |
394 | 1.00k | else |
395 | 1.00k | { |
396 | 1.00k | ps_dec->u2_fld_parity = BOTTOM; |
397 | 1.00k | } |
398 | 2.79k | ps_dec->u2_field_dct = 0; |
399 | 2.79k | ps_dec->u2_read_dct_type = 0; |
400 | 2.79k | ps_dec->u2_read_motion_type = 1; |
401 | 2.79k | ps_dec->u2_fld_pic = 1; |
402 | 2.79k | ps_dec->u2_frm_pic = 0; |
403 | 2.79k | ps_dec->ps_func_forw_or_back = gas_impeg2d_func_fld_fw_or_bk; |
404 | 2.79k | ps_dec->ps_func_bi_direct = gas_impeg2d_func_fld_bi_direct; |
405 | 2.79k | } |
406 | | /* Frame Picture */ |
407 | 17.8k | else |
408 | 17.8k | { |
409 | 17.8k | pic_buf_t *ps_pic_buf; |
410 | | |
411 | | |
412 | 17.8k | ps_dec->u2_num_vert_mb = (ps_dec->u2_vertical_size + 15) >> 4; |
413 | 17.8k | u4_get_disp = 1; |
414 | 17.8k | ps_pic_buf = impeg2_buf_mgr_get_next_free(ps_dec->pv_pic_buf_mg, &ps_dec->i4_cur_buf_id); |
415 | | |
416 | 17.8k | if (NULL == ps_pic_buf) |
417 | 1.21k | { |
418 | 1.21k | return IMPEG2D_NO_FREE_BUF_ERR; |
419 | 1.21k | } |
420 | 16.6k | impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_DISP); |
421 | 16.6k | impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF); |
422 | 16.6k | if(ps_dec->u4_deinterlace) |
423 | 16.6k | impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, MPEG2_BUF_MGR_DEINT); |
424 | | |
425 | 16.6k | ps_pic_buf->u4_ts = ps_dec->u4_inp_ts; |
426 | 16.6k | ps_pic_buf->e_pic_type = ps_dec->e_pic_type; |
427 | 16.6k | ps_dec->ps_cur_pic = ps_pic_buf; |
428 | 16.6k | ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y; |
429 | 16.6k | ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u; |
430 | 16.6k | ps_dec->s_cur_frm_buf.pu1_v = ps_pic_buf->pu1_v; |
431 | | |
432 | | |
433 | 16.6k | if(ps_dec->u2_frame_pred_frame_dct == 0) |
434 | 3.48k | { |
435 | 3.48k | ps_dec->u2_read_dct_type = 1; |
436 | 3.48k | ps_dec->u2_read_motion_type = 1; |
437 | 3.48k | } |
438 | 13.1k | else |
439 | 13.1k | { |
440 | 13.1k | ps_dec->u2_read_dct_type = 0; |
441 | 13.1k | ps_dec->u2_read_motion_type = 0; |
442 | 13.1k | ps_dec->u2_motion_type = 2; |
443 | 13.1k | ps_dec->u2_field_dct = 0; |
444 | 13.1k | } |
445 | | |
446 | 16.6k | ps_dec->u2_fld_parity = TOP; |
447 | 16.6k | ps_dec->u2_fld_pic = 0; |
448 | 16.6k | ps_dec->u2_frm_pic = 1; |
449 | 16.6k | ps_dec->ps_func_forw_or_back = gas_impeg2d_func_frm_fw_or_bk; |
450 | 16.6k | ps_dec->ps_func_bi_direct = gas_impeg2d_func_frm_bi_direct; |
451 | 16.6k | } |
452 | 19.4k | ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision; |
453 | 19.4k | ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; |
454 | 19.4k | ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; |
455 | 19.4k | ps_dec->u2_num_mbs_left = ps_dec->u2_num_horiz_mb * ps_dec->u2_num_vert_mb; |
456 | 19.4k | if(u4_get_disp) |
457 | 18.6k | { |
458 | 18.6k | if(ps_dec->u4_num_frames_decoded > 1) |
459 | 11.8k | { |
460 | 11.8k | ps_disp_pic = impeg2_disp_mgr_get(&ps_dec->s_disp_mgr, &ps_dec->i4_disp_buf_id); |
461 | 11.8k | } |
462 | 18.6k | ps_dec->ps_disp_pic = ps_disp_pic; |
463 | 18.6k | if(ps_disp_pic) |
464 | 9.79k | { |
465 | 9.79k | if(1 == ps_dec->u4_share_disp_buf) |
466 | 0 | { |
467 | 0 | ps_dec->ps_disp_frm_buf->pv_y_buf = ps_disp_pic->pu1_y; |
468 | 0 | if(IV_YUV_420P == ps_dec->i4_chromaFormat) |
469 | 0 | { |
470 | 0 | ps_dec->ps_disp_frm_buf->pv_u_buf = ps_disp_pic->pu1_u; |
471 | 0 | ps_dec->ps_disp_frm_buf->pv_v_buf = ps_disp_pic->pu1_v; |
472 | 0 | } |
473 | 0 | else |
474 | 0 | { |
475 | 0 | UWORD8 *pu1_buf; |
476 | |
|
477 | 0 | pu1_buf = ps_dec->as_disp_buffers[ps_disp_pic->i4_buf_id].pu1_bufs[1]; |
478 | 0 | ps_dec->ps_disp_frm_buf->pv_u_buf = pu1_buf; |
479 | |
|
480 | 0 | pu1_buf = ps_dec->as_disp_buffers[ps_disp_pic->i4_buf_id].pu1_bufs[2]; |
481 | 0 | ps_dec->ps_disp_frm_buf->pv_v_buf = pu1_buf; |
482 | 0 | } |
483 | 0 | } |
484 | 9.79k | } |
485 | 18.6k | } |
486 | | |
487 | | |
488 | 19.4k | switch(ps_dec->e_pic_type) |
489 | 19.4k | { |
490 | 5.47k | case I_PIC: |
491 | 5.47k | { |
492 | 5.47k | ps_dec->pf_decode_slice = impeg2d_dec_i_slice; |
493 | 5.47k | break; |
494 | 0 | } |
495 | 6.38k | case D_PIC: |
496 | 6.38k | { |
497 | 6.38k | ps_dec->pf_decode_slice = impeg2d_dec_d_slice; |
498 | 6.38k | break; |
499 | 0 | } |
500 | 4.11k | case P_PIC: |
501 | 4.11k | { |
502 | 4.11k | ps_dec->pf_decode_slice = impeg2d_dec_p_b_slice; |
503 | 4.11k | ps_dec->pu2_mb_type = gau2_impeg2d_p_mb_type; |
504 | 4.11k | break; |
505 | 0 | } |
506 | 3.49k | case B_PIC: |
507 | 3.49k | { |
508 | 3.49k | ps_dec->pf_decode_slice = impeg2d_dec_p_b_slice; |
509 | 3.49k | ps_dec->pu2_mb_type = gau2_impeg2d_b_mb_type; |
510 | 3.49k | break; |
511 | 0 | } |
512 | 0 | default: |
513 | 0 | return IMPEG2D_INVALID_PIC_TYPE; |
514 | 19.4k | } |
515 | | |
516 | | /*************************************************************************/ |
517 | | /* Set the reference pictures */ |
518 | | /*************************************************************************/ |
519 | | |
520 | | /* Error resilience: If forward and backward pictures are going to be NULL*/ |
521 | | /* then assign both to the current */ |
522 | | /* if one of them NULL then we will assign the non null to the NULL one */ |
523 | | |
524 | 19.4k | if(ps_dec->e_pic_type == P_PIC) |
525 | 4.11k | { |
526 | 4.11k | if (NULL == ps_dec->as_recent_fld[1][0].pu1_y) |
527 | 1.23k | { |
528 | 1.23k | ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf; |
529 | 1.23k | } |
530 | 4.11k | if (NULL == ps_dec->as_recent_fld[1][1].pu1_y) |
531 | 1.23k | { |
532 | 1.23k | impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1], |
533 | 1.23k | ps_dec->u2_frame_width); |
534 | 1.23k | } |
535 | | |
536 | 4.11k | ps_dec->as_ref_buf[FORW][TOP] = ps_dec->as_recent_fld[1][0]; |
537 | 4.11k | ps_dec->as_ref_buf[FORW][BOTTOM] = ps_dec->as_recent_fld[1][1]; |
538 | | |
539 | | |
540 | 4.11k | } |
541 | 15.3k | else if(ps_dec->e_pic_type == B_PIC) |
542 | 3.49k | { |
543 | 3.49k | if((NULL == ps_dec->as_recent_fld[1][0].pu1_y) && (NULL == ps_dec->as_recent_fld[0][0].pu1_y)) |
544 | 914 | { |
545 | | // assign the current picture to both |
546 | 914 | ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf; |
547 | 914 | impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1], |
548 | 914 | ps_dec->u2_frame_width); |
549 | 914 | ps_dec->as_recent_fld[0][0] = ps_dec->s_cur_frm_buf; |
550 | 914 | ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1]; |
551 | 914 | } |
552 | | //Assign the non-null picture to the null picture |
553 | 2.57k | else if ((NULL != ps_dec->as_recent_fld[1][0].pu1_y) && (NULL == ps_dec->as_recent_fld[0][0].pu1_y)) |
554 | 164 | { |
555 | 164 | ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0]; |
556 | 164 | ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1]; |
557 | 164 | } |
558 | 2.41k | else if ((NULL == ps_dec->as_recent_fld[1][0].pu1_y) && (NULL != ps_dec->as_recent_fld[0][0].pu1_y)) |
559 | 0 | { |
560 | 0 | ps_dec->as_recent_fld[1][0] = ps_dec->as_recent_fld[0][0]; |
561 | 0 | ps_dec->as_recent_fld[1][1] = ps_dec->as_recent_fld[0][1]; |
562 | 0 | } |
563 | | |
564 | | /* Error resilience: If forward and backward pictures are going to be NULL*/ |
565 | | /* then assign both to the current */ |
566 | | /* if one of them NULL then we will assign the non null to the NULL one */ |
567 | | |
568 | 3.49k | if((NULL == ps_dec->as_recent_fld[0][1].pu1_y) && (NULL == ps_dec->as_recent_fld[1][1].pu1_y)) |
569 | 32 | { |
570 | | // assign the current picture to both |
571 | 32 | ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf; |
572 | 32 | impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1], |
573 | 32 | ps_dec->u2_frame_width); |
574 | 32 | ps_dec->as_recent_fld[0][0] = ps_dec->s_cur_frm_buf; |
575 | 32 | ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1]; |
576 | 32 | } |
577 | | //Assign the non-null picture to the null picture |
578 | | |
579 | 3.45k | else if((NULL == ps_dec->as_recent_fld[0][1].pu1_y) && (NULL != ps_dec->as_recent_fld[1][1].pu1_y)) |
580 | 8 | { |
581 | 8 | ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0]; |
582 | 8 | ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1]; |
583 | 8 | } |
584 | | |
585 | 3.45k | else if((NULL == ps_dec->as_recent_fld[1][1].pu1_y) && (NULL != ps_dec->as_recent_fld[0][1].pu1_y)) |
586 | 0 | { |
587 | 0 | ps_dec->as_recent_fld[1][0] = ps_dec->as_recent_fld[0][0]; |
588 | 0 | ps_dec->as_recent_fld[1][1] = ps_dec->as_recent_fld[0][1]; |
589 | 0 | } |
590 | 3.49k | ps_dec->as_ref_buf[FORW][TOP] = ps_dec->as_recent_fld[0][0]; |
591 | 3.49k | ps_dec->as_ref_buf[FORW][BOTTOM] = ps_dec->as_recent_fld[0][1]; |
592 | 3.49k | ps_dec->as_ref_buf[BACK][TOP] = ps_dec->as_recent_fld[1][0]; |
593 | 3.49k | ps_dec->as_ref_buf[BACK][BOTTOM] = ps_dec->as_recent_fld[1][1]; |
594 | | |
595 | | |
596 | 3.49k | } |
597 | | |
598 | 19.4k | return e_error; |
599 | 19.4k | } |
600 | | |
601 | | /******************************************************************************* |
602 | | * |
603 | | * Function Name : impeg2d_post_pic_dec_proc |
604 | | * |
605 | | * Description : Performs processing that is needed at the end of picture |
606 | | * decode |
607 | | * |
608 | | * Arguments : |
609 | | * dec : Decoder context |
610 | | * |
611 | | * Values Returned : None |
612 | | *******************************************************************************/ |
613 | | void impeg2d_post_pic_dec_proc(dec_state_t *ps_dec) |
614 | 19.4k | { |
615 | | |
616 | 19.4k | WORD32 u4_update_pic_buf = 0; |
617 | | /*************************************************************************/ |
618 | | /* Processing at the end of picture */ |
619 | | /*************************************************************************/ |
620 | 19.4k | if(ps_dec->u2_picture_structure != FRAME_PICTURE) |
621 | 2.79k | { |
622 | 2.79k | ps_dec->u2_num_vert_mb = (ps_dec->u2_vertical_size + 31) >> 5; |
623 | | |
624 | 2.79k | if(ps_dec->u2_num_flds_decoded == 1) |
625 | 836 | { |
626 | 836 | ps_dec->u2_num_flds_decoded = 0; |
627 | 836 | u4_update_pic_buf = 1; |
628 | 836 | } |
629 | 1.96k | else |
630 | 1.96k | { |
631 | 1.96k | ps_dec->u2_num_flds_decoded = 1; |
632 | 1.96k | } |
633 | 2.79k | } |
634 | 16.6k | else |
635 | 16.6k | { |
636 | 16.6k | u4_update_pic_buf = 1; |
637 | 16.6k | } |
638 | | |
639 | 19.4k | if(u4_update_pic_buf) |
640 | 17.4k | { |
641 | 17.4k | ps_dec->i4_frame_decoded = 1; |
642 | 17.4k | if(ps_dec->e_pic_type != B_PIC) |
643 | 14.5k | { |
644 | | /* In any sequence first two pictures have to be reference pictures */ |
645 | | /* Adding of first picture in the sequence */ |
646 | 14.5k | if(ps_dec->aps_ref_pics[0] == NULL) |
647 | 5.19k | { |
648 | 5.19k | ps_dec->aps_ref_pics[0] = ps_dec->ps_cur_pic; |
649 | 5.19k | } |
650 | | |
651 | | /* Adding of second picture in the sequence */ |
652 | 9.39k | else if(ps_dec->aps_ref_pics[1] == NULL) |
653 | 1.40k | { |
654 | 1.40k | ps_dec->aps_ref_pics[1] = ps_dec->ps_cur_pic; |
655 | 1.40k | impeg2_disp_mgr_add(&ps_dec->s_disp_mgr, ps_dec->aps_ref_pics[0], ps_dec->aps_ref_pics[0]->i4_buf_id); |
656 | 1.40k | } |
657 | 7.99k | else |
658 | 7.99k | { |
659 | | |
660 | 7.99k | impeg2_disp_mgr_add(&ps_dec->s_disp_mgr, ps_dec->aps_ref_pics[1], ps_dec->aps_ref_pics[1]->i4_buf_id); |
661 | 7.99k | impeg2_buf_mgr_release(ps_dec->pv_pic_buf_mg, ps_dec->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF); |
662 | 7.99k | ps_dec->aps_ref_pics[0] = ps_dec->aps_ref_pics[1]; |
663 | 7.99k | ps_dec->aps_ref_pics[1] = ps_dec->ps_cur_pic; |
664 | | |
665 | 7.99k | } |
666 | 14.5k | } |
667 | 2.90k | else |
668 | 2.90k | { |
669 | 2.90k | impeg2_disp_mgr_add(&ps_dec->s_disp_mgr, ps_dec->ps_cur_pic, ps_dec->ps_cur_pic->i4_buf_id); |
670 | | |
671 | 2.90k | impeg2_buf_mgr_release(ps_dec->pv_pic_buf_mg, ps_dec->ps_cur_pic->i4_buf_id, BUF_MGR_REF); |
672 | 2.90k | } |
673 | | |
674 | 17.4k | } |
675 | | /*************************************************************************/ |
676 | | /* Update the list of recent reference pictures */ |
677 | | /*************************************************************************/ |
678 | 19.4k | if(ps_dec->e_pic_type != B_PIC) |
679 | 15.9k | { |
680 | 15.9k | switch(ps_dec->u2_picture_structure) |
681 | 15.9k | { |
682 | 13.8k | case FRAME_PICTURE: |
683 | 13.8k | { |
684 | 13.8k | ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0]; |
685 | 13.8k | ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1]; |
686 | | |
687 | 13.8k | ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf; |
688 | 13.8k | impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1], |
689 | 13.8k | ps_dec->u2_frame_width); |
690 | 13.8k | break; |
691 | 0 | } |
692 | 1.45k | case TOP_FIELD: |
693 | 1.45k | { |
694 | 1.45k | ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0]; |
695 | 1.45k | ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf; |
696 | 1.45k | break; |
697 | 0 | } |
698 | 632 | case BOTTOM_FIELD: |
699 | 632 | { |
700 | 632 | ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1]; |
701 | 632 | impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1], |
702 | 632 | ps_dec->u2_frame_width); |
703 | 632 | break; |
704 | 0 | } |
705 | 15.9k | } |
706 | 15.9k | } |
707 | 19.4k | } |