• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *******************************************************************************/
impeg2d_dec_i_mb_params(dec_state_t * ps_dec)57 void impeg2d_dec_i_mb_params(dec_state_t *ps_dec)
58 {
59 
60     UWORD16 u2_next_bits;
61     UWORD16 u2_bits_to_flush;
62     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     if(impeg2d_bit_stream_nxt(ps_stream,1) == 1) //Making sure the increment is one.
73     {
74         impeg2d_bit_stream_flush(ps_stream,1);
75     }
76     else if(ps_dec->u2_first_mb && ps_dec->u2_mb_x)
77     {
78         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             ps_dec->u2_mb_x = i4_mb_add_inc - 1;
92             ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1));
93     }
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     u2_next_bits = impeg2d_bit_stream_nxt(ps_stream,8);
103     if(BIT(u2_next_bits,7) == 1)
104     {
105         /* read the dct_type if needed */
106         u2_bits_to_flush = 1;
107         if(ps_dec->u2_read_dct_type)
108         {
109             u2_bits_to_flush++;
110             ps_dec->u2_field_dct = BIT(u2_next_bits,6);
111         }
112     }
113     else
114     {
115         u2_bits_to_flush = 7;
116         /*------------------------------------------------------------------*/
117         /* read the dct_type if needed                                      */
118         /*------------------------------------------------------------------*/
119         if(ps_dec->u2_read_dct_type)
120         {
121             u2_bits_to_flush++;
122             ps_dec->u2_field_dct = BIT(u2_next_bits,5);
123         }
124         else
125         {
126             u2_next_bits >>= 1;
127         }
128         /*------------------------------------------------------------------*/
129         /* Quant scale code decoding                                        */
130         /*------------------------------------------------------------------*/
131         {
132             UWORD16 quant_scale_code;
133             quant_scale_code = u2_next_bits & 0x1F;
134 
135             ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ?
136                 gau1_impeg2_non_linear_quant_scale[quant_scale_code] :
137                 (quant_scale_code << 1);
138         }
139     }
140     impeg2d_bit_stream_flush(ps_stream,u2_bits_to_flush);
141     /*************************************************************************/
142     /* Decoding of motion vectors if concealment motion vectors are present  */
143     /*************************************************************************/
144     if(ps_dec->u2_concealment_motion_vectors)
145     {
146         if(ps_dec->u2_picture_structure != FRAME_PICTURE)
147             impeg2d_bit_stream_flush(ps_stream,1);
148         impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[FORW][FIRST],ps_dec->ai2_mv[FORW][FIRST],
149             ps_dec->au2_f_code[FORW],0,0);
150 
151         /* Flush the marker bit */
152         if(0 == (impeg2d_bit_stream_get(ps_stream,1)))
153         {
154             /* Ignore marker bit error */
155         }
156 
157     }
158     ps_dec->u2_first_mb = 0;
159     return;
160 }
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 *******************************************************************************/
impeg2d_dec_i_slice(dec_state_t * ps_dec)171 IMPEG2D_ERROR_CODES_T impeg2d_dec_i_slice(dec_state_t *ps_dec)
172 {
173     WORD16 *pi2_vld_out;
174     UWORD32 i;
175     yuv_buf_t *ps_cur_frm_buf = &ps_dec->s_cur_frm_buf;
176 
177     UWORD32 u4_frame_width = ps_dec->u2_frame_width;
178     UWORD32 u4_frm_offset = 0;
179     UWORD8  *pu1_out_p;
180     IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
181 
182 
183     pi2_vld_out = ps_dec->ai2_vld_buf;
184 
185 
186     if(ps_dec->u2_picture_structure != FRAME_PICTURE)
187     {
188         u4_frame_width <<= 1;
189         if(ps_dec->u2_picture_structure == BOTTOM_FIELD)
190         {
191             u4_frm_offset = ps_dec->u2_frame_width;
192         }
193     }
194 
195     do
196     {
197         UWORD32 u4_x_offset,u4_y_offset;
198         UWORD32 u4_blk_pos;
199         UWORD32 u4_x_dst_offset = 0;
200         UWORD32 u4_y_dst_offset = 0;
201 
202 
203         IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y);
204 
205         impeg2d_dec_i_mb_params(ps_dec);
206 
207         u4_x_dst_offset = u4_frm_offset + (ps_dec->u2_mb_x << 4);
208         u4_y_dst_offset = (ps_dec->u2_mb_y << 4) * u4_frame_width;
209         pu1_out_p = ps_cur_frm_buf->pu1_y + u4_x_dst_offset + u4_y_dst_offset;
210 
211         for(i = 0; i < NUM_LUMA_BLKS; ++i)
212         {
213 
214             e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out,
215                                             ps_dec->pu1_inv_scan_matrix, 1, Y_LUMA, 0);
216             if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
217             {
218                 return e_error;
219             }
220 
221             u4_x_offset = gai2_impeg2_blk_x_off[i];
222 
223             if(ps_dec->u2_field_dct == 0)
224                 u4_y_offset = gai2_impeg2_blk_y_off_frm[i] ;
225             else
226                 u4_y_offset = gai2_impeg2_blk_y_off_fld[i] ;
227 
228             u4_blk_pos = u4_y_offset * u4_frame_width + u4_x_offset;
229             IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
230 
231             PROFILE_DISABLE_IDCT_IF0
232             {
233                 WORD32 i4_idx;
234                 i4_idx = 1;
235                 if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
236                     i4_idx = 0;
237 
238                 ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
239                                                         ps_dec->ai2_idct_stg1,
240                                                         (UWORD8 *)gau1_impeg2_zerobuf,
241                                                         pu1_out_p + u4_blk_pos,
242                                                         8,
243                                                         8,
244                                                         u4_frame_width << ps_dec->u2_field_dct,
245                                                         ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
246 
247             }
248 
249         }
250 
251         /* For U and V blocks, divide the x and y offsets by 2. */
252         u4_x_dst_offset >>= 1;
253         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         e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out,
259                                         ps_dec->pu1_inv_scan_matrix, 1, U_CHROMA, 0);
260         if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
261         {
262             return e_error;
263         }
264 
265         pu1_out_p = ps_cur_frm_buf->pu1_u + u4_x_dst_offset + u4_y_dst_offset;
266         IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
267         PROFILE_DISABLE_IDCT_IF0
268         {
269             WORD32 i4_idx;
270             i4_idx = 1;
271             if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
272                 i4_idx = 0;
273 
274             ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
275                                                     ps_dec->ai2_idct_stg1,
276                                                     (UWORD8 *)gau1_impeg2_zerobuf,
277                                                     pu1_out_p,
278                                                     8,
279                                                     8,
280                                                     u4_frame_width >> 1,
281                                                     ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
282 
283         }
284         /* Write the idct_out block to the current frame dec->curFrame*/
285         /* In case of field DCT type, write to alternate lines */
286         e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out,
287                                         ps_dec->pu1_inv_scan_matrix, 1, V_CHROMA, 0);
288         if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
289         {
290             return e_error;
291         }
292 
293         pu1_out_p = ps_cur_frm_buf->pu1_v + u4_x_dst_offset + u4_y_dst_offset;
294         IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
295         PROFILE_DISABLE_IDCT_IF0
296         {
297             WORD32 i4_idx;
298             i4_idx = 1;
299             if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
300                 i4_idx = 0;
301             ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
302                                                     ps_dec->ai2_idct_stg1,
303                                                     (UWORD8 *)gau1_impeg2_zerobuf,
304                                                     pu1_out_p,
305                                                     8,
306                                                     8,
307                                                     u4_frame_width >> 1,
308                                                     ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
309         }
310         ps_dec->u2_num_mbs_left--;
311 
312 
313         ps_dec->u2_mb_x++;
314 
315         if(ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset)
316         {
317             return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
318         }
319         else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
320         {
321             ps_dec->u2_mb_x = 0;
322             ps_dec->u2_mb_y++;
323         }
324 
325     }
326     while(ps_dec->u2_num_mbs_left != 0 && impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,23) != 0x0);
327     return e_error;
328 }
329