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); 8089b4c1cf9e2d18c27c2d9c8c7504e5e2d79ef289Venkatarama Avadhani 8189b4c1cf9e2d18c27c2d9c8c7504e5e2d79ef289Venkatarama Avadhani if(!u2_mb_addr_incr) 8289b4c1cf9e2d18c27c2d9c8c7504e5e2d79ef289Venkatarama Avadhani { 8389b4c1cf9e2d18c27c2d9c8c7504e5e2d79ef289Venkatarama Avadhani return IV_FAIL; 8489b4c1cf9e2d18c27c2d9c8c7504e5e2d79ef289Venkatarama Avadhani } 8589b4c1cf9e2d18c27c2d9c8c7504e5e2d79ef289Venkatarama Avadhani 86aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_first_mb) 87aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 88aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 89aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* If the 2nd member of a field picture pair is a P picture and */ 90aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* the first one was an I picture, there cannot be any skipped */ 91aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MBs in the second field picture */ 92aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 93aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* 94aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((dec->picture_structure != FRAME_PICTURE) && 95aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (dec->f->FieldFuncCall != 0) && 96aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (dec->las->u1_last_coded_vop_type == I)) 97aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 98aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani core0_err_handler((void *)(VOLParams), 99aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ITTMPEG2_ERR_INVALID_MB_SKIP); 100aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 101aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani */ 102aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 103aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-2, the last MB of the row cannot be skipped and the */ 104aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MBAddrIncr cannot be such that it will take the current MB */ 105aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* beyond the current row */ 106aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-1, the slice could start and end anywhere and is not */ 107aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* restricted to a row like in MPEG-2. Hence this check should */ 108aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* not be done for MPEG-1 streams. */ 109aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 110aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_is_mpeg2 && ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb) ) 111aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 112aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x; 113aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 114aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 115f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani if ((u2_mb_addr_incr - 1) > ps_dec->u2_num_mbs_left) 116f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani { 117f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani /* If the number of skip MBs are more than the number of MBs 118f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani * left, indicate error. 119f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani */ 120f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani return IV_FAIL; 121f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani } 122f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani 123aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1)); 124aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 1254262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani else 1264262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani { 1274262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani 1284262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /****************************************************************/ 1294262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* Section 6.3.17 */ 1304262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* The first MB of a slice cannot be skipped */ 1314262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* But the mb_addr_incr can be > 1, because at the beginning of */ 1324262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* a slice, it indicates the offset from the last MB in the */ 1334262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* previous row. Hence for the first slice in a row, the */ 1344262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* mb_addr_incr needs to be 1. */ 1354262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /****************************************************************/ 1364262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* MB_x is set to zero whenever MB_y changes. */ 1374262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani ps_dec->u2_mb_x = u2_mb_addr_incr - 1; 1384262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* For error resilience */ 1394262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1)); 1404262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani ps_dec->u2_num_mbs_left = ((ps_dec->u2_num_vert_mb - ps_dec->u2_mb_y) 1414262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani * ps_dec->u2_num_horiz_mb) - ps_dec->u2_mb_x; 1424262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani 1434262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /****************************************************************/ 1444262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* mb_addr_incr is forced to 1 because in this decoder it is used */ 1454262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* more as an indicator of the number of MBs skipped than the */ 1464262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /* as defined by the standard (Section 6.3.17) */ 1474262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani /****************************************************************/ 1484262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani u2_mb_addr_incr = 1; 1494262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani ps_dec->u2_first_mb = 0; 1504262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani 1514262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani } 152aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 153aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 154aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16); 155aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 156aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB type */ 157aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 158aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 159aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_type = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)]; 160aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_len = BITS(u2_mb_type,15,8); 161aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len = u2_len; 162aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len); 163aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 164aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 165aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* motion type */ 166aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 167aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 168aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_FORW_OR_BACK) && ps_dec->u2_read_motion_type) 169aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 170aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 i4_motion_type; 171aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14); 172aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_MOTION_TYPE_LEN; 173aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN); 174aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = ps_dec->u2_motion_type; 175aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 176aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((i4_motion_type == 0) || 177aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 4) || 178aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type > 7)) 179aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 180aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani //TODO : VANG Check for validity 181aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = 1; 182aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 183aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 184aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 185aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 186aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 187aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* dct type */ 188aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 189aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 190aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type) 191aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 192aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15); 193aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_DCT_TYPE_LEN; 194aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN); 195aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 196aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 197aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 198aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Quant scale code */ 199aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 200aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_QUANT) 201aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 202aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_quant_scale_code; 203aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11); 204aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 205aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ? 206aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1); 207aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_QUANT_SCALE_CODE_LEN; 208aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 209aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,u2_total_len); 210aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 211aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Set the function pointers */ 212aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 213aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_coded_mb = (UWORD16)(u2_mb_type & MB_CODED); 214aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 215aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_FORW_OR_BACK) 216aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 217aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 218aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 refPic = !(u2_mb_type & MB_MV_FORW); 219aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 index = (ps_dec->u2_motion_type); 220aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 221aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = (e_pred_direction_t)refPic; 222aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index]; 223aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 22458a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar if(NULL == ps_dec_mb_params->pf_func_mb_params) 22558a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return -1; 226aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 227aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 228aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 229aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_TYPE_INTRA) 230aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 231aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 232aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_intra_mb(ps_dec); 233aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 234aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 235aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 236aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 237aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 238aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = FORW; 239aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = 0; 240aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_0mv_coded_mb(ps_dec); 241aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 242aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 243aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 244aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* decode cbp */ 245aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 246aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_TYPE_INTRA)) 247aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 248aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0x3f; 249aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 250aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 251aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 252aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 253aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 254aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision; 255aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 256aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 257aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_coded_mb)) 258aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 259aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 cbpValue; 260aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani cbpValue = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)]; 261aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = cbpValue & 0xFF; 262aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF); 263aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 264aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 265aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 266aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0; 267aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 268aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 26958a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return 0; 270aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 271aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 272aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 273aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani/******************************************************************************* 274aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 275aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Function Name : impeg2d_dec_pnb_mb_params 276aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 277aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Description : Decodes the parameters for P and B pictures 278aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 279aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Arguments : 280aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* dec : Decoder context 281aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 282aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Values Returned : None 283aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani*******************************************************************************/ 28458a6822d7140137ce957c6d2fc20bae1374186c1Harish MahendrakarWORD32 impeg2d_dec_pnb_mb_params(dec_state_t *ps_dec) 285aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani{ 286aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stream_t *ps_stream = &ps_dec->s_bit_stream; 287aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_mb_addr_incr; 288aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_total_len; 289aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_len; 290aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_mb_type; 291aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_next_word; 292aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani const dec_mb_params_t *ps_dec_mb_params; 293aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(impeg2d_bit_stream_nxt(ps_stream,1) == 1) 294aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 295aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,1); 296aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 297aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 298aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 299aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 300aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = impeg2d_get_mb_addr_incr(ps_stream); 301aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 30255afb9d20dc6c001fd6667f6a4d7d3399aa2e62cVenkatarama NG. Avadhani if(0 == u2_mb_addr_incr) 30355afb9d20dc6c001fd6667f6a4d7d3399aa2e62cVenkatarama NG. Avadhani { 30455afb9d20dc6c001fd6667f6a4d7d3399aa2e62cVenkatarama NG. Avadhani return IV_FAIL; 30555afb9d20dc6c001fd6667f6a4d7d3399aa2e62cVenkatarama NG. Avadhani } 30655afb9d20dc6c001fd6667f6a4d7d3399aa2e62cVenkatarama NG. Avadhani 307aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_first_mb) 308aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 309aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 310aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Section 6.3.17 */ 311aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* The first MB of a slice cannot be skipped */ 312aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* But the mb_addr_incr can be > 1, because at the beginning of */ 313aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* a slice, it indicates the offset from the last MB in the */ 314aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* previous row. Hence for the first slice in a row, the */ 315aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr needs to be 1. */ 316aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 317aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB_x is set to zero whenever MB_y changes. */ 318aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = u2_mb_addr_incr - 1; 319aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* For error resilience */ 320aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1)); 3214262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani ps_dec->u2_num_mbs_left = ((ps_dec->u2_num_vert_mb - ps_dec->u2_mb_y) 3224262d8eeee23d169ab0a141f103592f7172d95bcVenkatarama Avadhani * ps_dec->u2_num_horiz_mb) - ps_dec->u2_mb_x; 323aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 324aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 325aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr is forced to 1 because in this decoder it is used */ 326aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* more as an indicator of the number of MBs skipped than the */ 327aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* as defined by the standard (Section 6.3.17) */ 328aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 329aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = 1; 330aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 0; 331aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 332aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 333aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 334aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 335aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-2, the last MB of the row cannot be skipped and the */ 336aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* mb_addr_incr cannot be such that it will take the current MB */ 337aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* beyond the current row */ 338aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In MPEG-1, the slice could start and end anywhere and is not */ 339aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* restricted to a row like in MPEG-2. Hence this check should */ 340aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* not be done for MPEG-1 streams. */ 341aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /****************************************************************/ 342aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_is_mpeg2 && 343aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb)) 344aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 345aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_addr_incr = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x; 346aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 347aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 348f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani if ((u2_mb_addr_incr - 1) > ps_dec->u2_num_mbs_left) 349f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani { 350f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani /* If the number of skip MBs are more than the number of MBs 351f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani * left, indicate error. 352f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani */ 353f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani return IV_FAIL; 354f217b853e7527552290bd047381338f934bccdd6Venkatarama Avadhani } 355aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 356aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1)); 357aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 358aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 359aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 360aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16); 361aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 362aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* MB type */ 363aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 364aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 365aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_mb_type = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)]; 366aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_len = BITS(u2_mb_type,15,8); 367aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len = u2_len; 368aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len); 369aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 370aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 371aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* motion type */ 372aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 373aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 374aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 i4_motion_type = ps_dec->u2_motion_type; 375aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 376aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_FORW_OR_BACK) && ps_dec->u2_read_motion_type) 377aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 378aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14); 379aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_MOTION_TYPE_LEN; 380aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN); 381aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = ps_dec->u2_motion_type; 382aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 383aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 384aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 385aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 386aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((u2_mb_type & MB_FORW_OR_BACK) && 387aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ((i4_motion_type == 0) || 388aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 3) || 389aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type == 4) || 390aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani (i4_motion_type >= 7))) 391aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 392aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani //TODO: VANG Check for validity 393aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani i4_motion_type = 1; 394aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 395aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 396aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 397aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 398aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* dct type */ 399aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 400aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 401aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type) 402aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 403aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15); 404aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_DCT_TYPE_LEN; 405aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN); 406aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 407aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 408aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 409aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Quant scale code */ 410aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 411aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_QUANT) 412aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 413aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_quant_scale_code; 414aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11); 415aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 416aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ? 417aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1); 418aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u2_total_len += MB_QUANT_SCALE_CODE_LEN; 419aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 420aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,u2_total_len); 421aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 422aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* Set the function pointers */ 423aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 424aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_coded_mb = (UWORD16)(u2_mb_type & MB_CODED); 425aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 426aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(u2_mb_type & MB_BIDRECT) 427aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 428aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_index = (ps_dec->u2_motion_type); 429aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 430aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 431aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = BIDIRECT; 432aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_bi_direct[u2_index]; 433aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 43458a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar if(NULL == ps_dec_mb_params->pf_func_mb_params) 43558a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return -1; 436aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 437aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 438aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_FORW_OR_BACK) 439aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 440aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 441aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_refPic = !(u2_mb_type & MB_MV_FORW); 442aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 u2_index = (ps_dec->u2_motion_type); 443aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 444aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = (e_pred_direction_t)u2_refPic; 445aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[u2_index]; 446aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type; 44758a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar if(NULL == ps_dec_mb_params->pf_func_mb_params) 44858a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return -1; 449aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_func_mb_params(ps_dec); 450aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 451aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 452aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else if(u2_mb_type & MB_TYPE_INTRA) 453aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 454aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 455aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_intra_mb(ps_dec); 456aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 457aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 458aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 459aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 460aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb =0; 461aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->e_mb_pred = FORW; 462aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_motion_type = 0; 463aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_dec_0mv_coded_mb(ps_dec); 464aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 465aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 466aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 467aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* decode cbp */ 468aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*-----------------------------------------------------------------------*/ 469aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((u2_mb_type & MB_TYPE_INTRA)) 470aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 471aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0x3f; 472aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 1; 473aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 474aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 475aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 476aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 477aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision; 478aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 479aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision; 480aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_coded_mb)) 481aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 482aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 cbpValue; 483aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani cbpValue = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)]; 484aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = cbpValue & 0xFF; 485aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF); 486aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 487aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 488aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 489aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_cbp = 0; 490aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 491aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 49258a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return 0; 493aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 494aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 495aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani/******************************************************************************* 496aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Function Name : impeg2d_dec_p_b_slice 497aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 498aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Description : Decodes P and B slices 499aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 500aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Arguments : 501aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* dec : Decoder state 502aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* 503aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani* Values Returned : None 504aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani*******************************************************************************/ 505aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama AvadhaniIMPEG2D_ERROR_CODES_T impeg2d_dec_p_b_slice(dec_state_t *ps_dec) 506aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani{ 507aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD16 *pi2_vld_out; 508aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 i; 509aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani yuv_buf_t *ps_cur_frm_buf = &ps_dec->s_cur_frm_buf; 510aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 511aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_frm_offset = 0; 512aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani const dec_mb_params_t *ps_dec_mb_params; 513aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE; 514aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 515aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pi2_vld_out = ps_dec->ai2_vld_buf; 516aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani memset(ps_dec->ai2_pred_mv,0,sizeof(ps_dec->ai2_pred_mv)); 517aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 518aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb = 0; 519aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 1; 520aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 521aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width = ps_dec->u2_frame_width; 522aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 523aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_picture_structure != FRAME_PICTURE) 524aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 525aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width <<= 1; 526aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_picture_structure == BOTTOM_FIELD) 527aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 528aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_frm_offset = ps_dec->u2_frame_width; 529aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 530aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 531aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 532aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani do 533aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 534aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_x_offset, u4_y_offset; 53558a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar WORD32 ret; 536aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 537aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 538aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_x_dst_offset = 0; 539aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 u4_y_dst_offset = 0; 540aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD8 *pu1_out_p; 541aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD8 *pu1_pred; 542aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 u4_pred_strd; 543aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 544aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y); 545aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 546aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->e_pic_type == B_PIC) 54758a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar ret = impeg2d_dec_pnb_mb_params(ps_dec); 548aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 54958a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar ret = impeg2d_dec_p_mb_params(ps_dec); 550aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 55158a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar if(ret) 55258a6822d7140137ce957c6d2fc20bae1374186c1Harish Mahendrakar return IMPEG2D_MB_TEX_DECODE_ERR; 5532df080153464bf57084d68ba3594e199bc140eb4Venkatarama Avadhani 5542df080153464bf57084d68ba3594e199bc140eb4Venkatarama Avadhani if(0 >= ps_dec->u2_num_mbs_left) 5552df080153464bf57084d68ba3594e199bc140eb4Venkatarama Avadhani { 5562df080153464bf57084d68ba3594e199bc140eb4Venkatarama Avadhani break; 5572df080153464bf57084d68ba3594e199bc140eb4Venkatarama Avadhani } 5582df080153464bf57084d68ba3594e199bc140eb4Venkatarama Avadhani 559aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y); 560aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 561aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_dst_offset = u4_frm_offset + (ps_dec->u2_mb_x << 4); 562aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_dst_offset = (ps_dec->u2_mb_y << 4) * ps_dec->u2_picture_width; 563aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_y + u4_x_dst_offset + u4_y_dst_offset; 564aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_prev_intra_mb == 0) 565aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 566aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD32 offset_x, offset_y, stride; 567aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani UWORD16 index = (ps_dec->u2_motion_type); 568aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /*only for non intra mb's*/ 569aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->e_mb_pred == BIDIRECT) 570aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 571aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_bi_direct[index]; 572aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 573aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 574aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 575aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index]; 576aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 577aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 578aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stride = ps_dec->u2_picture_width; 579aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 580aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani offset_x = u4_frm_offset + (ps_dec->u2_mb_x << 4); 581aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 582aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani offset_y = (ps_dec->u2_mb_y << 4); 583aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 584aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_y = ps_cur_frm_buf->pu1_y + offset_y * stride + offset_x; 585aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 586aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani stride = stride >> 1; 587aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 588aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_u = ps_cur_frm_buf->pu1_u + (offset_y >> 1) * stride 589aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani + (offset_x >> 1); 590aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 591aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->s_dest_buf.pu1_v = ps_cur_frm_buf->pu1_v + (offset_y >> 1) * stride 592aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani + (offset_x >> 1); 593aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 594aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_MC_IF0 595aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec_mb_params->pf_mc(ps_dec); 596aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 597aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 598aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani for(i = 0; i < NUM_LUMA_BLKS; ++i) 599aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 600aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & (1 << (BLOCKS_IN_MB - 1 - i))) != 0) 601aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 602aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix, 603aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb, Y_LUMA, 0); 604aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) 605aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 606aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 607aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 608aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 609aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_offset = gai2_impeg2_blk_x_off[i]; 610aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 611aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->u2_field_dct == 0) 612aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_offset = gai2_impeg2_blk_y_off_frm[i] ; 613aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 614aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_offset = gai2_impeg2_blk_y_off_fld[i] ; 615aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 616aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 617aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 618aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 619aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 620aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); 621aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 622aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_IDCT_IF0 623aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 624aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 idx; 625aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) 626aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 0; 627aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 628aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 1; 629aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 630aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 631aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 632aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset; 633aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width << ps_dec->u2_field_dct; 634aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 635aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 636aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 637aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 638aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 639aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 640aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 641aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 642aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 643aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 644aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset, 645aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 646aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 647aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width << ps_dec->u2_field_dct, 648aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 649aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 650aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 651aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 652aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 653aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 654aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* For U and V blocks, divide the x and y offsets by 2. */ 655aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_x_dst_offset >>= 1; 656aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_y_dst_offset >>= 2; 657aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 658aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 659aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* In case of chrominance blocks the DCT will be frame DCT */ 660aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani /* i = 0, U component and i = 1 is V componet */ 661aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & 0x02) != 0) 662aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 663aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_u + 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, U_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 682aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 683aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 684aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p; 685aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width >> 1; 686aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 687aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 688aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 689aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 690aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 691aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 692aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 693aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 694aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 695aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 696aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p, 697aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 698aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 699aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width >> 1, 700aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 701aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 702aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 703aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 704aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 705aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 706aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 707aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if((ps_dec->u2_cbp & 0x01) != 0) 708aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 709aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p = ps_cur_frm_buf->pu1_v + u4_x_dst_offset + u4_y_dst_offset; 710aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix, 711aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_prev_intra_mb, V_CHROMA, 0); 712aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error) 713aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 714aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 715aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 716aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 717aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 718aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows); 719aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 720aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani PROFILE_DISABLE_IDCT_IF0 721aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 722aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani WORD32 idx; 723aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows)) 724aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 0; 725aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 726aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani idx = 1; 727aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(0 == ps_dec->u2_prev_intra_mb) 728aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 729aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = pu1_out_p; 730aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = ps_dec->u2_picture_width >> 1; 731aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 732aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani else 733aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 734aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf; 735aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd = 8; 736aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 737aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 738aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out, 739aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->ai2_idct_stg1, 740aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_pred, 741aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani pu1_out_p, 742aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 8, 743aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani u4_pred_strd, 744aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_picture_width >> 1, 745aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows); 746aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 747aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 748aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 749aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 750aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_num_mbs_left--; 751aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_first_mb = 0; 752aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x++; 753aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 754aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani if(ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset) 755aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 756aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR; 757aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 758b34913857dacd4b7f82715c48ae1de9c56ede9e0Venkatarama Avadhani else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) 759aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani { 760aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_x = 0; 761aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani ps_dec->u2_mb_y++; 762aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani 763aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 764aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani } 765aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani while(ps_dec->u2_num_mbs_left != 0 && impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,23) != 0x0); 766aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani return e_error; 767aed24eee7ddfc93f1436b0c1679431bd286879b4Venkatarama Avadhani} 768