impeg2d_pnb_pic.c revision aed24eee7ddfc93f1436b0c1679431bd286879b4
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*******************************************************************************/ 63aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhanivoid 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 109aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1)); 110aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 111aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 112aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 113aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16); 114aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 115aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB type */ 116aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 117aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 118aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_type = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)]; 119aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_len = BITS(u2_mb_type,15,8); 120aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len = u2_len; 121aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len); 122aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 123aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 124aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* motion type */ 125aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 126aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 127aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_FORW_OR_BACK) && ps_dec->u2_read_motion_type) 128aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 129aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 i4_motion_type; 130aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14); 131aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_MOTION_TYPE_LEN; 132aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN); 133aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = ps_dec->u2_motion_type; 134aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 135aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((i4_motion_type == 0) || 136aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 4) || 137aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type > 7)) 138aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 139aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani //TODO : VANG Check for validity 140aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = 1; 141aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 142aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 143aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 144aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 145aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 146aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* dct type */ 147aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 148aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 149aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type) 150aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 151aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15); 152aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_DCT_TYPE_LEN; 153aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN); 154aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 155aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 156aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 157aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Quant scale code */ 158aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 159aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_QUANT) 160aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 161aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_quant_scale_code; 162aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11); 163aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 164aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ? 165aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1); 166aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_QUANT_SCALE_CODE_LEN; 167aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 168aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,u2_total_len); 169aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 170aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Set the function pointers */ 171aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 172aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_coded_mb = (UWORD16)(u2_mb_type & MB_CODED); 173aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 174aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_FORW_OR_BACK) 175aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 176aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 177aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 refPic = !(u2_mb_type & MB_MV_FORW); 178aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 index = (ps_dec->u2_motion_type); 179aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 180aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = (e_pred_direction_t)refPic; 181aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index]; 182aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 183aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 184aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 185aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 186aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_TYPE_INTRA) 187aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 188aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 189aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_intra_mb(ps_dec); 190aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 191aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 192aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 193aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 194aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 195aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = FORW; 196aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = 0; 197aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_0mv_coded_mb(ps_dec); 198aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 199aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 200aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 201aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* decode cbp */ 202aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 203aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_TYPE_INTRA)) 204aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 205aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0x3f; 206aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 207aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 208aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 209aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 210aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 211aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision; 212aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 213aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 214aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_coded_mb)) 215aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 216aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 cbpValue; 217aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani cbpValue = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)]; 218aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = cbpValue & 0xFF; 219aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF); 220aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 221aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 222aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 223aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0; 224aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 225aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 226aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 227aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 228aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 229aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani/******************************************************************************* 230aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 231aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Function Name : impeg2d_dec_pnb_mb_params 232aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 233aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Description : Decodes the parameters for P and B pictures 234aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 235aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Arguments : 236aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* dec : Decoder context 237aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 238aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Values Returned : None 239aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani*******************************************************************************/ 240aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhanivoid impeg2d_dec_pnb_mb_params(dec_state_t *ps_dec) 241aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani{ 242aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stream_t *ps_stream = &ps_dec->s_bit_stream; 243aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_mb_addr_incr; 244aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_total_len; 245aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_len; 246aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_mb_type; 247aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_next_word; 248aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani const dec_mb_params_t *ps_dec_mb_params; 249aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(impeg2d_bit_stream_nxt(ps_stream,1) == 1) 250aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 251aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,1); 252aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 253aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 254aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 255aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 256aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = impeg2d_get_mb_addr_incr(ps_stream); 257aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 258aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_first_mb) 259aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 260aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 261aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Section 6.3.17 */ 262aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* The first MB of a slice cannot be skipped */ 263aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* But the mb_addr_incr can be > 1, because at the beginning of */ 264aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* a slice, it indicates the offset from the last MB in the */ 265aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* previous row. Hence for the first slice in a row, the */ 266aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr needs to be 1. */ 267aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 268aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB_x is set to zero whenever MB_y changes. */ 269aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = u2_mb_addr_incr - 1; 270aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* For error resilience */ 271aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1)); 272aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 273aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 274aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr is forced to 1 because in this decoder it is used */ 275aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* more as an indicator of the number of MBs skipped than the */ 276aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* as defined by the standard (Section 6.3.17) */ 277aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 278aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = 1; 279aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 0; 280aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 281aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 282aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 283aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 284aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-2, the last MB of the row cannot be skipped and the */ 285aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr cannot be such that it will take the current MB */ 286aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* beyond the current row */ 287aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-1, the slice could start and end anywhere and is not */ 288aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* restricted to a row like in MPEG-2. Hence this check should */ 289aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* not be done for MPEG-1 streams. */ 290aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 291aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_is_mpeg2 && 292aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb)) 293aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 294aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x; 295aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 296aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 297aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 298aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1)); 299aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 300aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 301aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 302aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16); 303aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 304aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB type */ 305aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 306aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 307aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_type = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)]; 308aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_len = BITS(u2_mb_type,15,8); 309aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len = u2_len; 310aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len); 311aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 312aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 313aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* motion type */ 314aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 315aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 316aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 i4_motion_type = ps_dec->u2_motion_type; 317aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 318aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_FORW_OR_BACK) && ps_dec->u2_read_motion_type) 319aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 320aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14); 321aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_MOTION_TYPE_LEN; 322aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN); 323aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = ps_dec->u2_motion_type; 324aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 325aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 326aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 327aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 328aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((u2_mb_type & MB_FORW_OR_BACK) && 329aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ((i4_motion_type == 0) || 330aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 3) || 331aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 4) || 332aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type >= 7))) 333aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 334aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani //TODO: VANG Check for validity 335aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = 1; 336aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 337aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 338aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 339aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 340aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* dct type */ 341aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 342aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 343aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type) 344aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 345aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15); 346aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_DCT_TYPE_LEN; 347aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN); 348aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 349aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 350aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 351aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Quant scale code */ 352aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 353aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_QUANT) 354aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 355aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_quant_scale_code; 356aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11); 357aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 358aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ? 359aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1); 360aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_QUANT_SCALE_CODE_LEN; 361aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 362aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,u2_total_len); 363aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 364aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Set the function pointers */ 365aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 366aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_coded_mb = (UWORD16)(u2_mb_type & MB_CODED); 367aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 368aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_BIDRECT) 369aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 370aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_index = (ps_dec->u2_motion_type); 371aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 372aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 373aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = BIDIRECT; 374aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_bi_direct[u2_index]; 375aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 376aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 377aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 378aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_FORW_OR_BACK) 379aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 380aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 381aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_refPic = !(u2_mb_type & MB_MV_FORW); 382aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_index = (ps_dec->u2_motion_type); 383aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 384aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = (e_pred_direction_t)u2_refPic; 385aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[u2_index]; 386aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 387aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 388aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 389aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 390aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_TYPE_INTRA) 391aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 392aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 393aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_intra_mb(ps_dec); 394aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 395aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 396aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 397aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 398aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb =0; 399aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = FORW; 400aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = 0; 401aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_0mv_coded_mb(ps_dec); 402aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 403aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 404aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 405aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* decode cbp */ 406aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 407aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_TYPE_INTRA)) 408aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 409aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0x3f; 410aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 411aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 412aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 413aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 414aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 415aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision; 416aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 417aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 418aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_coded_mb)) 419aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 420aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 cbpValue; 421aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani cbpValue = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)]; 422aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = cbpValue & 0xFF; 423aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF); 424aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 425aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 426aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 427aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0; 428aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 429aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 430aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 431aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 432aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani/******************************************************************************* 433aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Function Name : impeg2d_dec_p_b_slice 434aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 435aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Description : Decodes P and B slices 436aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 437aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Arguments : 438aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* dec : Decoder state 439aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 440aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Values Returned : None 441aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani*******************************************************************************/ 442aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama AvadhaniIMPEG2D_ERROR_CODES_T impeg2d_dec_p_b_slice(dec_state_t *ps_dec) 443aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani{ 444aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD16 *pi2_vld_out; 445aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 i; 446aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani yuv_buf_t *ps_cur_frm_buf = &ps_dec->s_cur_frm_buf; 447aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 448aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_frm_offset = 0; 449aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani const dec_mb_params_t *ps_dec_mb_params; 450aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE; 451aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 452aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pi2_vld_out = ps_dec->ai2_vld_buf; 453aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani memset(ps_dec->ai2_pred_mv,0,sizeof(ps_dec->ai2_pred_mv)); 454aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 455aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 456aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 1; 457aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 458aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width = ps_dec->u2_frame_width; 459aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 460aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_picture_structure != FRAME_PICTURE) 461aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 462aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width <<= 1; 463aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_picture_structure == BOTTOM_FIELD) 464aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 465aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_frm_offset = ps_dec->u2_frame_width; 466aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 467aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 468aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 469aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani do 470aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 471aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_x_offset, u4_y_offset; 472aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 473aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 474aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 475aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_x_dst_offset = 0; 476aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_y_dst_offset = 0; 477aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD8 *pu1_out_p; 478aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD8 *pu1_pred; 479aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 u4_pred_strd; 480aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 481aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y); 482aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 483aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 484aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->e_pic_type == B_PIC) 485aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_pnb_mb_params(ps_dec); 486aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 487aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_p_mb_params(ps_dec); 488aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 489aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y); 490aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 491aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_dst_offset = u4_frm_offset + (ps_dec->u2_mb_x << 4); 492aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_dst_offset = (ps_dec->u2_mb_y << 4) * ps_dec->u2_picture_width; 493aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_y + u4_x_dst_offset + u4_y_dst_offset; 494aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_prev_intra_mb == 0) 495aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 496aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 offset_x, offset_y, stride; 497aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 index = (ps_dec->u2_motion_type); 498aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*only for non intra mb's*/ 499aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->e_mb_pred == BIDIRECT) 500aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 501aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_bi_direct[index]; 502aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 503aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 504aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 505aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index]; 506aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 507aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 508aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stride = ps_dec->u2_picture_width; 509aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 510aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani offset_x = u4_frm_offset + (ps_dec->u2_mb_x << 4); 511aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 512aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani offset_y = (ps_dec->u2_mb_y << 4); 513aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 514aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_y = ps_cur_frm_buf->pu1_y + offset_y * stride + offset_x; 515aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 516aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stride = stride >> 1; 517aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 518aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_u = ps_cur_frm_buf->pu1_u + (offset_y >> 1) * stride 519aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani + (offset_x >> 1); 520aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 521aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_v = ps_cur_frm_buf->pu1_v + (offset_y >> 1) * stride 522aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani + (offset_x >> 1); 523aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 524aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_MC_IF0 525aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_mc(ps_dec); 526aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 527aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 528aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani for(i = 0; i < NUM_LUMA_BLKS; ++i) 529aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 530aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & (1 << (BLOCKS_IN_MB - 1 - i))) != 0) 531aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 532aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix, 533aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb, Y_LUMA, 0); 534aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) 535aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 536aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 537aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 538aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 539aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_offset = gai2_impeg2_blk_x_off[i]; 540aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 541aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_field_dct == 0) 542aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_offset = gai2_impeg2_blk_y_off_frm[i] ; 543aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 544aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_offset = gai2_impeg2_blk_y_off_fld[i] ; 545aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 546aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 547aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 548aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 549aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 550aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); 551aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 552aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_IDCT_IF0 553aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 554aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 idx; 555aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) 556aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 0; 557aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 558aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 1; 559aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 560aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 561aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 562aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset; 563aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width << ps_dec->u2_field_dct; 564aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 565aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 566aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 567aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 568aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 569aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 570aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 571aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 572aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 573aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 574aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset, 575aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 576aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 577aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width << ps_dec->u2_field_dct, 578aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 579aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 580aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 581aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 582aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 583aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 584aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* For U and V blocks, divide the x and y offsets by 2. */ 585aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_dst_offset >>= 1; 586aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_dst_offset >>= 2; 587aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 588aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 589aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In case of chrominance blocks the DCT will be frame DCT */ 590aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* i = 0, U component and i = 1 is V componet */ 591aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & 0x02) != 0) 592aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 593aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_u + u4_x_dst_offset + u4_y_dst_offset; 594aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix, 595aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb, U_CHROMA, 0); 596aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) 597aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 598aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 599aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 600aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 601aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 602aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); 603aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 604aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_IDCT_IF0 605aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 606aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 idx; 607aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) 608aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 0; 609aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 610aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 1; 611aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 612aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 613aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 614aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p; 615aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width >> 1; 616aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 617aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 618aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 619aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 620aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 621aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 622aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 623aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 624aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 625aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 626aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p, 627aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 628aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 629aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width >> 1, 630aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 631aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 632aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 633aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 634aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 635aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 636aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 637aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & 0x01) != 0) 638aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 639aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_v + u4_x_dst_offset + u4_y_dst_offset; 640aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix, 641aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb, V_CHROMA, 0); 642aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) 643aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 644aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 645aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 646aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 647aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 648aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); 649aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 650aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_IDCT_IF0 651aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 652aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 idx; 653aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) 654aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 0; 655aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 656aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 1; 657aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 658aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 659aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p; 660aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width >> 1; 661aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 662aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 663aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 664aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 665aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 666aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 667aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 668aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 669aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 670aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 671aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p, 672aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 673aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 674aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width >> 1, 675aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 676aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 677aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 678aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 679aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 680aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 681aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_num_mbs_left--; 682aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 0; 683aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x++; 684aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 685aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset) 686aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 687aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR; 688aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 689aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset)) 690aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 691aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = 0; 692aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_y++; 693aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 694aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 695aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 696aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani while(ps_dec->u2_num_mbs_left != 0 && impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,23) != 0x0); 697aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 698aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 699