impeg2d_pnb_pic.c revision f217b853e7527552290bd047381338f934bccdd6
1aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani/****************************************************************************** 2aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * 3aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * Copyright (C) 2015 The Android Open Source Project 4aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * 5aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * Licensed under the Apache License, Version 2.0 (the "License"); 6aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * you may not use this file except in compliance with the License. 7aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * You may obtain a copy of the License at: 8aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * 9aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * http://www.apache.org/licenses/LICENSE-2.0 10aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * 11aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * Unless required by applicable law or agreed to in writing, software 12aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * distributed under the License is distributed on an "AS IS" BASIS, 13aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * See the License for the specific language governing permissions and 15aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * limitations under the License. 16aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * 17aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ***************************************************************************** 18aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani*/ 20aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include <stdio.h> 21aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include <string.h> 22aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 23aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "iv_datatypedef.h" 24aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "iv.h" 25aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 26aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_buf_mgr.h" 27aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_disp_mgr.h" 28aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_defs.h" 29aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_platform_macros.h" 30aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_inter_pred.h" 31aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_idct.h" 32aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_globals.h" 33aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_mem_func.h" 34aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_format_conv.h" 35aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2_macros.h" 36aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 37aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "ivd.h" 38aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2d.h" 39aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2d_bitstream.h" 40aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2d_structs.h" 41aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2d_vld_tables.h" 42aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2d_vld.h" 43aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2d_pic_proc.h" 44aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2d_debug.h" 45aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#include "impeg2d_mc.h" 46aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 47aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#define BLK_SIZE 8 48aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#define LUMA_BLK_SIZE (2 * (BLK_SIZE)) 49aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani#define CHROMA_BLK_SIZE (BLK_SIZE) 50aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 51aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 52aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani/******************************************************************************* 53aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 54aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Function Name : impeg2d_dec_p_mb_params 55aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 56aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Description : Decodes the parameters for P 57aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 58aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Arguments : 59aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* dec : Decoder context 60aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 61aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Values Returned : None 62aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani*******************************************************************************/ 6358a6822d7140137ce957c6d2fc20bae1374186c1Harish MahendrakarWORD32 impeg2d_dec_p_mb_params(dec_state_t *ps_dec) 64aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani{ 65aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stream_t *ps_stream = &ps_dec->s_bit_stream; 66aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_mb_addr_incr; 67aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_total_len; 68aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_len; 69aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_mb_type; 70aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_next_word; 71aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani const dec_mb_params_t *ps_dec_mb_params; 72aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(impeg2d_bit_stream_nxt(ps_stream,1) == 1) 73aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 74aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,1); 75aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 76aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 77aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 78aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 79aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = impeg2d_get_mb_addr_incr(ps_stream); 80aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_first_mb) 81aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 82aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 83aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* If the 2nd member of a field picture pair is a P picture and */ 84aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* the first one was an I picture, there cannot be any skipped */ 85aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MBs in the second field picture */ 86aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 87aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* 88aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((dec->picture_structure != FRAME_PICTURE) && 89aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (dec->f->FieldFuncCall != 0) && 90aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (dec->las->u1_last_coded_vop_type == I)) 91aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 92aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani core0_err_handler((void *)(VOLParams), 93aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ITTMPEG2_ERR_INVALID_MB_SKIP); 94aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 95aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani */ 96aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 97aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-2, the last MB of the row cannot be skipped and the */ 98aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MBAddrIncr cannot be such that it will take the current MB */ 99aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* beyond the current row */ 100aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-1, the slice could start and end anywhere and is not */ 101aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* restricted to a row like in MPEG-2. Hence this check should */ 102aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* not be done for MPEG-1 streams. */ 103aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 104aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_is_mpeg2 && ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb) ) 105aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 106aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x; 107aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 108aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 109f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani if ((u2_mb_addr_incr - 1) > ps_dec->u2_num_mbs_left) 110f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani { 111f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani /* If the number of skip MBs are more than the number of MBs 112f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani * left, indicate error. 113f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani */ 114f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani return IV_FAIL; 115f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani } 116f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani 117aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1)); 118aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 119aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 120aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 121aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16); 122aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 123aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB type */ 124aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 125aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 126aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_type = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)]; 127aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_len = BITS(u2_mb_type,15,8); 128aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len = u2_len; 129aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len); 130aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 131aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 132aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* motion type */ 133aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 134aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 135aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_FORW_OR_BACK) && ps_dec->u2_read_motion_type) 136aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 137aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 i4_motion_type; 138aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14); 139aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_MOTION_TYPE_LEN; 140aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN); 141aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = ps_dec->u2_motion_type; 142aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 143aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((i4_motion_type == 0) || 144aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 4) || 145aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type > 7)) 146aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 147aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani //TODO : VANG Check for validity 148aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = 1; 149aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 150aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 151aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 152aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 153aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 154aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* dct type */ 155aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 156aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 157aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type) 158aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 159aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15); 160aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_DCT_TYPE_LEN; 161aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN); 162aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 163aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 164aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 165aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Quant scale code */ 166aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 167aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_QUANT) 168aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 169aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_quant_scale_code; 170aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11); 171aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 172aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ? 173aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1); 174aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_QUANT_SCALE_CODE_LEN; 175aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 176aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,u2_total_len); 177aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 178aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Set the function pointers */ 179aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 180aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_coded_mb = (UWORD16)(u2_mb_type & MB_CODED); 181aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 182aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_FORW_OR_BACK) 183aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 184aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 185aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 refPic = !(u2_mb_type & MB_MV_FORW); 186aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 index = (ps_dec->u2_motion_type); 187aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 188aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = (e_pred_direction_t)refPic; 189aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index]; 190aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 19158a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar if(NULL == ps_dec_mb_params->pf_func_mb_params) 19258a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return -1; 193aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 194aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 195aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 196aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_TYPE_INTRA) 197aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 198aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 199aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_intra_mb(ps_dec); 200aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 201aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 202aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 203aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 204aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 205aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = FORW; 206aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = 0; 207aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_0mv_coded_mb(ps_dec); 208aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 209aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 210aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 211aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* decode cbp */ 212aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 213aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_TYPE_INTRA)) 214aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 215aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0x3f; 216aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 217aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 218aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 219aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 220aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 221aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision; 222aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 223aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 224aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_coded_mb)) 225aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 226aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 cbpValue; 227aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani cbpValue = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)]; 228aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = cbpValue & 0xFF; 229aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF); 230aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 231aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 232aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 233aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0; 234aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 235aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 23658a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return 0; 237aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 238aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 239aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 240aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani/******************************************************************************* 241aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 242aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Function Name : impeg2d_dec_pnb_mb_params 243aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 244aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Description : Decodes the parameters for P and B pictures 245aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 246aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Arguments : 247aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* dec : Decoder context 248aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 249aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Values Returned : None 250aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani*******************************************************************************/ 25158a6822d7140137ce957c6d2fc20bae1374186c1Harish MahendrakarWORD32 impeg2d_dec_pnb_mb_params(dec_state_t *ps_dec) 252aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani{ 253aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stream_t *ps_stream = &ps_dec->s_bit_stream; 254aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_mb_addr_incr; 255aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_total_len; 256aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_len; 257aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_mb_type; 258aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_next_word; 259aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani const dec_mb_params_t *ps_dec_mb_params; 260aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(impeg2d_bit_stream_nxt(ps_stream,1) == 1) 261aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 262aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,1); 263aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 264aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 265aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 266aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 267aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = impeg2d_get_mb_addr_incr(ps_stream); 268aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 269aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_first_mb) 270aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 271aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 272aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Section 6.3.17 */ 273aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* The first MB of a slice cannot be skipped */ 274aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* But the mb_addr_incr can be > 1, because at the beginning of */ 275aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* a slice, it indicates the offset from the last MB in the */ 276aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* previous row. Hence for the first slice in a row, the */ 277aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr needs to be 1. */ 278aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 279aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB_x is set to zero whenever MB_y changes. */ 280aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = u2_mb_addr_incr - 1; 281aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* For error resilience */ 282aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1)); 283aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 284aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 285aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr is forced to 1 because in this decoder it is used */ 286aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* more as an indicator of the number of MBs skipped than the */ 287aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* as defined by the standard (Section 6.3.17) */ 288aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 289aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = 1; 290aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 0; 291aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 292aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 293aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 294aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 295aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-2, the last MB of the row cannot be skipped and the */ 296aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr cannot be such that it will take the current MB */ 297aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* beyond the current row */ 298aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-1, the slice could start and end anywhere and is not */ 299aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* restricted to a row like in MPEG-2. Hence this check should */ 300aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* not be done for MPEG-1 streams. */ 301aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 302aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_is_mpeg2 && 303aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb)) 304aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 305aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x; 306aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 307aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 308f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani if ((u2_mb_addr_incr - 1) > ps_dec->u2_num_mbs_left) 309f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani { 310f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani /* If the number of skip MBs are more than the number of MBs 311f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani * left, indicate error. 312f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani */ 313f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani return IV_FAIL; 314f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani } 315aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 316aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1)); 317aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 318aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 319aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 320aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16); 321aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 322aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB type */ 323aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 324aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 325aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_type = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)]; 326aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_len = BITS(u2_mb_type,15,8); 327aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len = u2_len; 328aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len); 329aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 330aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 331aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* motion type */ 332aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 333aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 334aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 i4_motion_type = ps_dec->u2_motion_type; 335aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 336aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_FORW_OR_BACK) && ps_dec->u2_read_motion_type) 337aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 338aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14); 339aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_MOTION_TYPE_LEN; 340aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN); 341aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = ps_dec->u2_motion_type; 342aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 343aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 344aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 345aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 346aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((u2_mb_type & MB_FORW_OR_BACK) && 347aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ((i4_motion_type == 0) || 348aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 3) || 349aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 4) || 350aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type >= 7))) 351aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 352aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani //TODO: VANG Check for validity 353aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = 1; 354aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 355aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 356aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 357aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 358aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* dct type */ 359aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 360aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 361aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type) 362aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 363aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15); 364aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_DCT_TYPE_LEN; 365aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN); 366aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 367aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 368aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 369aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Quant scale code */ 370aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 371aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_QUANT) 372aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 373aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_quant_scale_code; 374aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11); 375aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 376aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ? 377aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1); 378aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_QUANT_SCALE_CODE_LEN; 379aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 380aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,u2_total_len); 381aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 382aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Set the function pointers */ 383aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 384aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_coded_mb = (UWORD16)(u2_mb_type & MB_CODED); 385aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 386aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_BIDRECT) 387aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 388aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_index = (ps_dec->u2_motion_type); 389aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 390aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 391aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = BIDIRECT; 392aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_bi_direct[u2_index]; 393aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 39458a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar if(NULL == ps_dec_mb_params->pf_func_mb_params) 39558a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return -1; 396aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 397aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 398aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_FORW_OR_BACK) 399aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 400aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 401aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_refPic = !(u2_mb_type & MB_MV_FORW); 402aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_index = (ps_dec->u2_motion_type); 403aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 404aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = (e_pred_direction_t)u2_refPic; 405aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[u2_index]; 406aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 40758a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar if(NULL == ps_dec_mb_params->pf_func_mb_params) 40858a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return -1; 409aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 410aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 411aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 412aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_TYPE_INTRA) 413aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 414aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 415aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_intra_mb(ps_dec); 416aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 417aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 418aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 419aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 420aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb =0; 421aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = FORW; 422aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = 0; 423aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_0mv_coded_mb(ps_dec); 424aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 425aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 426aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 427aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* decode cbp */ 428aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 429aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_TYPE_INTRA)) 430aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 431aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0x3f; 432aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 433aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 434aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 435aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 436aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 437aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision; 438aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 439aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 440aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_coded_mb)) 441aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 442aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 cbpValue; 443aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani cbpValue = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)]; 444aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = cbpValue & 0xFF; 445aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF); 446aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 447aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 448aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 449aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0; 450aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 451aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 45258a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return 0; 453aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 454aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 455aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani/******************************************************************************* 456aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Function Name : impeg2d_dec_p_b_slice 457aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 458aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Description : Decodes P and B slices 459aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 460aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Arguments : 461aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* dec : Decoder state 462aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 463aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Values Returned : None 464aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani*******************************************************************************/ 465aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama AvadhaniIMPEG2D_ERROR_CODES_T impeg2d_dec_p_b_slice(dec_state_t *ps_dec) 466aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani{ 467aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD16 *pi2_vld_out; 468aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 i; 469aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani yuv_buf_t *ps_cur_frm_buf = &ps_dec->s_cur_frm_buf; 470aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 471aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_frm_offset = 0; 472aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani const dec_mb_params_t *ps_dec_mb_params; 473aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE; 474aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 475aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pi2_vld_out = ps_dec->ai2_vld_buf; 476aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani memset(ps_dec->ai2_pred_mv,0,sizeof(ps_dec->ai2_pred_mv)); 477aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 478aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 479aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 1; 480aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 481aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width = ps_dec->u2_frame_width; 482aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 483aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_picture_structure != FRAME_PICTURE) 484aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 485aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width <<= 1; 486aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_picture_structure == BOTTOM_FIELD) 487aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 488aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_frm_offset = ps_dec->u2_frame_width; 489aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 490aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 491aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 492aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani do 493aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 494aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_x_offset, u4_y_offset; 49558a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar WORD32 ret; 496aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 497aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 498aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_x_dst_offset = 0; 499aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_y_dst_offset = 0; 500aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD8 *pu1_out_p; 501aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD8 *pu1_pred; 502aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 u4_pred_strd; 503aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 504aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y); 505aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 506aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->e_pic_type == B_PIC) 50758a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar ret = impeg2d_dec_pnb_mb_params(ps_dec); 508aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 50958a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar ret = impeg2d_dec_p_mb_params(ps_dec); 510aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 51158a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar if(ret) 51258a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return IMPEG2D_MB_TEX_DECODE_ERR; 513aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y); 514aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 515aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_dst_offset = u4_frm_offset + (ps_dec->u2_mb_x << 4); 516aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_dst_offset = (ps_dec->u2_mb_y << 4) * ps_dec->u2_picture_width; 517aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_y + u4_x_dst_offset + u4_y_dst_offset; 518aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_prev_intra_mb == 0) 519aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 520aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 offset_x, offset_y, stride; 521aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 index = (ps_dec->u2_motion_type); 522aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*only for non intra mb's*/ 523aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->e_mb_pred == BIDIRECT) 524aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 525aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_bi_direct[index]; 526aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 527aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 528aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 529aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index]; 530aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 531aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 532aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stride = ps_dec->u2_picture_width; 533aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 534aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani offset_x = u4_frm_offset + (ps_dec->u2_mb_x << 4); 535aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 536aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani offset_y = (ps_dec->u2_mb_y << 4); 537aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 538aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_y = ps_cur_frm_buf->pu1_y + offset_y * stride + offset_x; 539aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 540aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stride = stride >> 1; 541aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 542aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_u = ps_cur_frm_buf->pu1_u + (offset_y >> 1) * stride 543aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani + (offset_x >> 1); 544aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 545aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_v = ps_cur_frm_buf->pu1_v + (offset_y >> 1) * stride 546aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani + (offset_x >> 1); 547aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 548aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_MC_IF0 549aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_mc(ps_dec); 550aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 551aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 552aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani for(i = 0; i < NUM_LUMA_BLKS; ++i) 553aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 554aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & (1 << (BLOCKS_IN_MB - 1 - i))) != 0) 555aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 556aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix, 557aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb, Y_LUMA, 0); 558aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) 559aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 560aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 561aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 562aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 563aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_offset = gai2_impeg2_blk_x_off[i]; 564aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 565aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_field_dct == 0) 566aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_offset = gai2_impeg2_blk_y_off_frm[i] ; 567aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 568aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_offset = gai2_impeg2_blk_y_off_fld[i] ; 569aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 570aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 571aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 572aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 573aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 574aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); 575aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 576aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_IDCT_IF0 577aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 578aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 idx; 579aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) 580aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 0; 581aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 582aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 1; 583aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 584aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 585aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 586aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset; 587aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width << ps_dec->u2_field_dct; 588aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 589aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 590aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 591aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 592aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 593aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 594aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 595aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 596aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 597aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 598aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset, 599aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 600aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 601aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width << ps_dec->u2_field_dct, 602aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 603aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 604aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 605aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 606aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 607aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 608aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* For U and V blocks, divide the x and y offsets by 2. */ 609aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_dst_offset >>= 1; 610aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_dst_offset >>= 2; 611aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 612aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 613aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In case of chrominance blocks the DCT will be frame DCT */ 614aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* i = 0, U component and i = 1 is V componet */ 615aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & 0x02) != 0) 616aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 617aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_u + u4_x_dst_offset + u4_y_dst_offset; 618aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix, 619aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb, U_CHROMA, 0); 620aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) 621aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 622aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 623aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 624aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 625aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 626aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); 627aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 628aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_IDCT_IF0 629aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 630aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 idx; 631aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) 632aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 0; 633aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 634aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 1; 635aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 636aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 637aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 638aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p; 639aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width >> 1; 640aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 641aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 642aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 643aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 644aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 645aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 646aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 647aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 648aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 649aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 650aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p, 651aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 652aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 653aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width >> 1, 654aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 655aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 656aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 657aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 658aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 659aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 660aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 661aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & 0x01) != 0) 662aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 663aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_v + u4_x_dst_offset + u4_y_dst_offset; 664aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix, 665aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb, V_CHROMA, 0); 666aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) 667aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 668aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 669aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 670aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 671aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 672aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); 673aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 674aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_IDCT_IF0 675aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 676aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 idx; 677aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) 678aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 0; 679aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 680aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 1; 681aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 682aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 683aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p; 684aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width >> 1; 685aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 686aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 687aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 688aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 689aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 690aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 691aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 692aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 693aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 694aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 695aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p, 696aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 697aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 698aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width >> 1, 699aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 700aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 701aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 702aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 703aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 704aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_num_mbs_left--; 705aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 0; 706aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x++; 707aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 708aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset) 709aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 710aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR; 711aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 712b34913857dacd4b7f82715c48ae1de9c56ede9e0Venkatarama Avadhani else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) 713aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 714aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = 0; 715aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_y++; 716aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 717aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 718aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 719aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani while(ps_dec->u2_num_mbs_left != 0 && impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,23) != 0x0); 720aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 721aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 722