Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 /*****************************************************************************/
     21 /*                                                                           */
     22 /*  File Name         : decoder_api_main.c                                   */
     23 /*                                                                           */
     24 /*  Description       : Functions which recieve the API call from user       */
     25 /*                                                                           */
     26 /*  List of Functions : <List the functions defined in this file>            */
     27 /*                                                                           */
     28 /*  Issues / Problems : None                                                 */
     29 /*                                                                           */
     30 /*  Revision History  :                                                      */
     31 /*                                                                           */
     32 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
     33 /*         30 05 2007   Rajneesh        Creation                             */
     34 /*                                                                           */
     35 /*****************************************************************************/
     36 
     37 /*****************************************************************************/
     38 /* File Includes                                                             */
     39 /*****************************************************************************/
     40 
     41 /* System include files */
     42 #include <stdio.h>
     43 #include <stdlib.h>
     44 #include <stddef.h>
     45 #include <string.h>
     46 
     47 /* User include files */
     48 #include "iv_datatypedef.h"
     49 #include "iv.h"
     50 #include "ivd.h"
     51 #include "ithread.h"
     52 
     53 #include "impeg2_job_queue.h"
     54 #include "impeg2_macros.h"
     55 #include "impeg2_buf_mgr.h"
     56 #include "impeg2_disp_mgr.h"
     57 #include "impeg2_defs.h"
     58 #include "impeg2_platform_macros.h"
     59 #include "impeg2_inter_pred.h"
     60 #include "impeg2_idct.h"
     61 #include "impeg2_format_conv.h"
     62 #include "impeg2_mem_func.h"
     63 
     64 #include "impeg2d.h"
     65 #include "impeg2d_api.h"
     66 #include "impeg2d_bitstream.h"
     67 #include "impeg2d_debug.h"
     68 #include "impeg2d_structs.h"
     69 #include "impeg2d_mc.h"
     70 #include "impeg2d_pic_proc.h"
     71 #include "impeg2d_deinterlace.h"
     72 
     73 #define NUM_FRAMES_LIMIT_ENABLED 0
     74 
     75 #ifdef LOGO_EN
     76 #include "impeg2_ittiam_logo.h"
     77 #define INSERT_LOGO(buf_y, buf_u, buf_v, stride, x_pos, y_pos, yuv_fmt,disp_wd,disp_ht) impeg2_insert_logo(buf_y, buf_u, buf_v, stride, x_pos, y_pos, yuv_fmt,disp_wd,disp_ht);
     78 #else
     79 #define INSERT_LOGO(buf_y, buf_u, buf_v, stride, x_pos, y_pos, yuv_fmt,disp_wd,disp_ht)
     80 #endif
     81 
     82 #if NUM_FRAMES_LIMIT_ENABLED
     83 #define NUM_FRAMES_LIMIT 10000
     84 #else
     85 #define NUM_FRAMES_LIMIT 0x7FFFFFFF
     86 #endif
     87 
     88 #define CODEC_NAME              "MPEG2VDEC"
     89 #define CODEC_RELEASE_TYPE      "eval"
     90 #define CODEC_RELEASE_VER       "01.00"
     91 #define CODEC_VENDOR            "ITTIAM"
     92 
     93 #ifdef __ANDROID__
     94 #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor)    \
     95     strcpy(version_string,"@(#)Id:");                                                               \
     96     strcat(version_string,codec_name);                                                              \
     97     strcat(version_string,"_");                                                                     \
     98     strcat(version_string,codec_release_type);                                                      \
     99     strcat(version_string," Ver:");                                                                 \
    100     strcat(version_string,codec_release_ver);                                                       \
    101     strcat(version_string," Released by ");                                                         \
    102     strcat(version_string,codec_vendor);
    103 #else
    104 #define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor)    \
    105     strcpy(version_string,"@(#)Id:");                                                               \
    106     strcat(version_string,codec_name);                                                              \
    107     strcat(version_string,"_");                                                                     \
    108     strcat(version_string,codec_release_type);                                                      \
    109     strcat(version_string," Ver:");                                                                 \
    110     strcat(version_string,codec_release_ver);                                                       \
    111     strcat(version_string," Released by ");                                                         \
    112     strcat(version_string,codec_vendor);                                                            \
    113     strcat(version_string," Build: ");                                                              \
    114     strcat(version_string,__DATE__);                                                                \
    115     strcat(version_string," @ ");                                                                       \
    116     strcat(version_string,__TIME__);
    117 #endif
    118 
    119 
    120 #define MIN_OUT_BUFS_420    3
    121 #define MIN_OUT_BUFS_422ILE 1
    122 #define MIN_OUT_BUFS_RGB565 1
    123 #define MIN_OUT_BUFS_420SP  2
    124 
    125 
    126 void impeg2d_init_arch(void *pv_codec);
    127 void impeg2d_init_function_ptr(void *pv_codec);
    128 UWORD32 impeg2d_get_outbuf_size(WORD32 pic_wd,UWORD32 pic_ht, WORD32 u1_chroma_format,UWORD32 *p_buf_size);
    129 
    130 /*****************************************************************************/
    131 /*                                                                           */
    132 /*  Function Name : impeg2d_api_rel_display_frame                            */
    133 /*                                                                           */
    134 /*  Description   : Release displ buffers that will be shared between decoder */
    135 /*                  and application                                          */
    136 /*  Inputs        : Error message                                            */
    137 /*  Globals       : None                                                     */
    138 /*  Processing    : Just prints error message to console                     */
    139 /*  Outputs       : Error mesage to the console                              */
    140 /*  Returns       : None                                                     */
    141 /*                                                                           */
    142 /*  Issues        : <List any issues or problems with this function>         */
    143 /*                                                                           */
    144 /*  Revision History:                                                        */
    145 /*                                                                           */
    146 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    147 /*         27 05 2006   Sankar          Creation                             */
    148 /*                                                                           */
    149 /*****************************************************************************/
    150 IV_API_CALL_STATUS_T impeg2d_api_rel_display_frame(iv_obj_t *ps_dechdl,
    151                                                    void *pv_api_ip,
    152                                                    void *pv_api_op)
    153 {
    154 
    155     ivd_rel_display_frame_ip_t  *dec_rel_disp_ip;
    156     ivd_rel_display_frame_op_t  *dec_rel_disp_op;
    157 
    158     dec_state_t *ps_dec_state;
    159     dec_state_multi_core_t *ps_dec_state_multi_core;
    160 
    161 
    162     dec_rel_disp_ip = (ivd_rel_display_frame_ip_t  *)pv_api_ip;
    163     dec_rel_disp_op = (ivd_rel_display_frame_op_t  *)pv_api_op;
    164 
    165     dec_rel_disp_op->u4_error_code = 0;
    166     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
    167     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
    168 
    169 
    170     /* If not in shared disp buf mode, return */
    171     if(0 == ps_dec_state->u4_share_disp_buf)
    172         return IV_SUCCESS;
    173 
    174     if(NULL == ps_dec_state->pv_pic_buf_mg)
    175         return IV_SUCCESS;
    176 
    177 
    178     impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, dec_rel_disp_ip->u4_disp_buf_id, BUF_MGR_DISP);
    179 
    180     return IV_SUCCESS;
    181 }
    182 
    183 /*****************************************************************************/
    184 /*                                                                           */
    185 /*  Function Name : impeg2d_api_set_display_frame                            */
    186 /*                                                                           */
    187 /*  Description   : Sets display buffers that will be shared between decoder */
    188 /*                  and application                                          */
    189 /*  Inputs        : Error message                                            */
    190 /*  Globals       : None                                                     */
    191 /*  Processing    : Just prints error message to console                     */
    192 /*  Outputs       : Error mesage to the console                              */
    193 /*  Returns       : None                                                     */
    194 /*                                                                           */
    195 /*  Issues        : <List any issues or problems with this function>         */
    196 /*                                                                           */
    197 /*  Revision History:                                                        */
    198 /*                                                                           */
    199 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    200 /*         27 05 2006   Sankar          Creation                             */
    201 /*                                                                           */
    202 /*****************************************************************************/
    203 IV_API_CALL_STATUS_T impeg2d_api_set_display_frame(iv_obj_t *ps_dechdl,
    204                                           void *pv_api_ip,
    205                                           void *pv_api_op)
    206 {
    207 
    208     ivd_set_display_frame_ip_t  *dec_disp_ip;
    209     ivd_set_display_frame_op_t  *dec_disp_op;
    210 
    211     UWORD32 i;
    212     dec_state_t *ps_dec_state;
    213     dec_state_multi_core_t *ps_dec_state_multi_core;
    214     UWORD32 u4_num_disp_bufs;
    215     UWORD32 u4_disp_buf_size[3];
    216     UWORD32 num_bufs;
    217 
    218 
    219     dec_disp_ip = (ivd_set_display_frame_ip_t  *)pv_api_ip;
    220     dec_disp_op = (ivd_set_display_frame_op_t  *)pv_api_op;
    221     dec_disp_op->u4_error_code = 0;
    222 
    223     u4_num_disp_bufs = dec_disp_ip->num_disp_bufs;
    224     if(u4_num_disp_bufs > BUF_MGR_MAX_CNT)
    225         u4_num_disp_bufs = BUF_MGR_MAX_CNT;
    226 
    227     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
    228     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
    229 
    230     num_bufs = dec_disp_ip->s_disp_buffer[0].u4_num_bufs;
    231 
    232     if(ps_dec_state->u4_share_disp_buf)
    233     {
    234         pic_buf_t *ps_pic_buf;
    235         ps_pic_buf = (pic_buf_t *)ps_dec_state->pv_pic_buf_base;
    236 
    237         /* Get the sizes of the first buffer structure. Compare this with the
    238          * rest to make sure all the buffers are of the same size.
    239          */
    240         u4_disp_buf_size[0] =
    241             dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[0];
    242         u4_disp_buf_size[1] =
    243             dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[1];
    244         u4_disp_buf_size[2] =
    245             dec_disp_ip->s_disp_buffer[0].u4_min_out_buf_size[2];
    246         for(i = 0; i < u4_num_disp_bufs; i++)
    247         {
    248             /* Verify all buffer structures have the same sized buffers as the
    249              * first buffer structure*/
    250             if ((dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[0]
    251                  != u4_disp_buf_size[0])
    252                  || (dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[1]
    253                      != u4_disp_buf_size[1])
    254                  || (dec_disp_ip->s_disp_buffer[i].u4_min_out_buf_size[2]
    255                      != u4_disp_buf_size[2]))
    256             {
    257               return IV_FAIL;
    258             }
    259             /* Verify all buffer structures have the same number of
    260              * buffers (e.g. y, u, v) */
    261             if (dec_disp_ip->s_disp_buffer[i].u4_num_bufs != num_bufs)
    262             {
    263                 return IV_FAIL;
    264             }
    265 
    266             ps_pic_buf->pu1_y = dec_disp_ip->s_disp_buffer[i].pu1_bufs[0];
    267             if(IV_YUV_420P == ps_dec_state->i4_chromaFormat)
    268             {
    269                 ps_pic_buf->pu1_u = dec_disp_ip->s_disp_buffer[i].pu1_bufs[1];
    270                 ps_pic_buf->pu1_v = dec_disp_ip->s_disp_buffer[i].pu1_bufs[2];
    271             }
    272             else
    273             {
    274                 ps_pic_buf->pu1_u = ps_dec_state->pu1_chroma_ref_buf[i];
    275                 ps_pic_buf->pu1_v = ps_dec_state->pu1_chroma_ref_buf[i] +
    276                         ((ps_dec_state->u2_create_max_width * ps_dec_state->u2_create_max_height) >> 2);
    277             }
    278 
    279             ps_pic_buf->i4_buf_id = i;
    280 
    281             ps_pic_buf->u1_used_as_ref = 0;
    282 
    283             ps_pic_buf->u4_ts = 0;
    284 
    285             impeg2_buf_mgr_add(ps_dec_state->pv_pic_buf_mg, ps_pic_buf, i);
    286             impeg2_buf_mgr_set_status(ps_dec_state->pv_pic_buf_mg, i, BUF_MGR_DISP);
    287             ps_pic_buf++;
    288 
    289         }
    290     }
    291     memcpy(&(ps_dec_state->as_disp_buffers[0]),
    292            &(dec_disp_ip->s_disp_buffer),
    293            u4_num_disp_bufs * sizeof(ivd_out_bufdesc_t));
    294 
    295     return IV_SUCCESS;
    296 
    297 }
    298 
    299 IV_API_CALL_STATUS_T impeg2d_api_set_num_cores(iv_obj_t *ps_dechdl,
    300                                                void *pv_api_ip,
    301                                                void *pv_api_op)
    302 {
    303     impeg2d_ctl_set_num_cores_ip_t   *ps_ip;
    304     impeg2d_ctl_set_num_cores_op_t *ps_op;
    305     dec_state_t *ps_dec_state;
    306     dec_state_multi_core_t *ps_dec_state_multi_core;
    307 
    308     ps_ip  = (impeg2d_ctl_set_num_cores_ip_t *)pv_api_ip;
    309     ps_op =  (impeg2d_ctl_set_num_cores_op_t *)pv_api_op;
    310 
    311     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
    312     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
    313 
    314     if(ps_ip->u4_num_cores > 0)
    315     {
    316 
    317 
    318         WORD32 i;
    319         for(i = 0; i < MAX_THREADS; i++)
    320             ps_dec_state_multi_core->ps_dec_state[i]->i4_num_cores = ps_ip->u4_num_cores;
    321     }
    322     else
    323     {
    324         ps_dec_state->i4_num_cores = 1;
    325     }
    326     ps_op->u4_error_code = IV_SUCCESS;
    327 
    328     return IV_SUCCESS;
    329 }
    330 
    331 IV_API_CALL_STATUS_T impeg2d_api_get_seq_info(iv_obj_t *ps_dechdl,
    332                                                void *pv_api_ip,
    333                                                void *pv_api_op)
    334 {
    335     impeg2d_ctl_get_seq_info_ip_t *ps_ip;
    336     impeg2d_ctl_get_seq_info_op_t *ps_op;
    337     dec_state_t *ps_codec;
    338     dec_state_multi_core_t *ps_dec_state_multi_core;
    339 
    340     ps_ip  = (impeg2d_ctl_get_seq_info_ip_t *)pv_api_ip;
    341     ps_op =  (impeg2d_ctl_get_seq_info_op_t *)pv_api_op;
    342 
    343     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
    344     ps_codec = ps_dec_state_multi_core->ps_dec_state[0];
    345     UNUSED(ps_ip);
    346     if(ps_codec->u2_header_done == 1)
    347     {
    348         ps_op->u1_aspect_ratio_information = ps_codec->u2_aspect_ratio_info;
    349         ps_op->u1_frame_rate_code = ps_codec->u2_frame_rate_code;
    350         ps_op->u1_frame_rate_extension_n = ps_codec->u2_frame_rate_extension_n;
    351         ps_op->u1_frame_rate_extension_d = ps_codec->u2_frame_rate_extension_d;
    352         if(ps_codec->u1_seq_disp_extn_present == 1)
    353         {
    354             ps_op->u1_video_format = ps_codec->u1_video_format;
    355             ps_op->u1_colour_primaries = ps_codec->u1_colour_primaries;
    356             ps_op->u1_transfer_characteristics = ps_codec->u1_transfer_characteristics;
    357             ps_op->u1_matrix_coefficients = ps_codec->u1_matrix_coefficients;
    358             ps_op->u2_display_horizontal_size = ps_codec->u2_display_horizontal_size;
    359             ps_op->u2_display_vertical_size = ps_codec->u2_display_vertical_size;
    360         }
    361         else
    362         {
    363             ps_op->u1_video_format = 5;
    364             ps_op->u1_colour_primaries = 2;
    365             ps_op->u1_transfer_characteristics = 2;
    366             ps_op->u1_matrix_coefficients = 2;
    367             ps_op->u2_display_horizontal_size = ps_codec->u2_horizontal_size;
    368             ps_op->u2_display_vertical_size = ps_codec->u2_vertical_size;
    369         }
    370         ps_op->u4_error_code = IV_SUCCESS;
    371         return IV_SUCCESS;
    372     }
    373     else
    374     {
    375         ps_op->u4_error_code = IV_FAIL;
    376         return IV_FAIL;
    377     }
    378 }
    379 
    380 /**
    381 *******************************************************************************
    382 *
    383 * @brief
    384 *  Sets Processor type
    385 *
    386 * @par Description:
    387 *  Sets Processor type
    388 *
    389 * @param[in] ps_codec_obj
    390 *  Pointer to codec object at API level
    391 *
    392 * @param[in] pv_api_ip
    393 *  Pointer to input argument structure
    394 *
    395 * @param[out] pv_api_op
    396 *  Pointer to output argument structure
    397 *
    398 * @returns  Status
    399 *
    400 * @remarks
    401 *
    402 *
    403 *******************************************************************************
    404 */
    405 
    406 IV_API_CALL_STATUS_T impeg2d_set_processor(iv_obj_t *ps_codec_obj,
    407                             void *pv_api_ip,
    408                             void *pv_api_op)
    409 {
    410     impeg2d_ctl_set_processor_ip_t *ps_ip;
    411     impeg2d_ctl_set_processor_op_t *ps_op;
    412     dec_state_t *ps_codec;
    413     dec_state_multi_core_t *ps_dec_state_multi_core;
    414 
    415     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_codec_obj->pv_codec_handle);
    416     ps_codec = ps_dec_state_multi_core->ps_dec_state[0];
    417 
    418     ps_ip = (impeg2d_ctl_set_processor_ip_t *)pv_api_ip;
    419     ps_op = (impeg2d_ctl_set_processor_op_t *)pv_api_op;
    420 
    421     ps_codec->e_processor_arch = (IVD_ARCH_T)ps_ip->u4_arch;
    422     ps_codec->e_processor_soc = (IVD_SOC_T)ps_ip->u4_soc;
    423 
    424     impeg2d_init_function_ptr(ps_codec);
    425 
    426 
    427     ps_op->u4_error_code = 0;
    428     return IV_SUCCESS;
    429 }
    430 /*****************************************************************************/
    431 /*                                                                           */
    432 /*  Function Name : impeg2d_fill_mem_rec                                     */
    433 /*                                                                           */
    434 /*  Description   :                                                          */
    435 /*  Inputs        :                                                          */
    436 /*  Globals       :                                                          */
    437 /*  Processing    :                                                          */
    438 /*  Outputs       :                                                          */
    439 /*  Returns       :                                                          */
    440 /*                                                                           */
    441 /*  Issues        :                                                          */
    442 /*                                                                           */
    443 /*  Revision History:                                                        */
    444 /*                                                                           */
    445 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    446 /*         17 09 2007  Rajendra C Y          Draft                           */
    447 /*                                                                           */
    448 /*****************************************************************************/
    449 void impeg2d_fill_mem_rec(impeg2d_fill_mem_rec_ip_t *ps_ip,
    450                   impeg2d_fill_mem_rec_op_t *ps_op)
    451 {
    452     UWORD32 u4_i;
    453 
    454     UWORD8 u1_no_rec = 0;
    455     UWORD32 max_frm_width,max_frm_height,max_frm_size;
    456     iv_mem_rec_t *ps_mem_rec = ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location;
    457     WORD32 i4_num_threads;
    458     WORD32 i4_share_disp_buf, i4_chroma_format;
    459     WORD32 i4_chroma_size;
    460     UWORD32 u4_deinterlace;
    461     UNUSED(u4_deinterlace);
    462     max_frm_width = ALIGN16(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd);
    463     /* In error clips with field prediction, the mv may incorrectly refer to
    464     * the last MB row, causing an out of bounds read access. Allocating 8 extra
    465     * rows to handle this. Adding another extra row to handle half_y prediction.
    466     */
    467     max_frm_height = ALIGN32(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht) + 9;
    468 
    469     max_frm_size = (max_frm_width * max_frm_height * 3) >> 1;/* 420 P */
    470 
    471     i4_chroma_size = max_frm_width * max_frm_height / 4;
    472 
    473     if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size > offsetof(impeg2d_fill_mem_rec_ip_t, u4_share_disp_buf))
    474     {
    475 #ifndef LOGO_EN
    476         i4_share_disp_buf = ps_ip->u4_share_disp_buf;
    477 #else
    478         i4_share_disp_buf = 0;
    479 #endif
    480     }
    481     else
    482     {
    483         i4_share_disp_buf = 0;
    484     }
    485     if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size > offsetof(impeg2d_fill_mem_rec_ip_t, e_output_format))
    486     {
    487         i4_chroma_format = ps_ip->e_output_format;
    488     }
    489     else
    490     {
    491         i4_chroma_format = -1;
    492     }
    493 
    494     if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size > offsetof(impeg2d_fill_mem_rec_ip_t, u4_deinterlace))
    495     {
    496         u4_deinterlace = ps_ip->u4_deinterlace;
    497     }
    498     else
    499     {
    500         u4_deinterlace = 0;
    501     }
    502 
    503 
    504     if( (i4_chroma_format != IV_YUV_420P) &&
    505         (i4_chroma_format != IV_YUV_420SP_UV) &&
    506         (i4_chroma_format != IV_YUV_420SP_VU))
    507     {
    508         i4_share_disp_buf = 0;
    509     }
    510 
    511     /* Disable deinterlacer in shared mode */
    512     if(i4_share_disp_buf)
    513     {
    514         u4_deinterlace = 0;
    515     }
    516 
    517     /*************************************************************************/
    518     /*          Fill the memory requirement XDM Handle         */
    519     /*************************************************************************/
    520     /* ! */
    521     ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/;
    522     ps_mem_rec->e_mem_type      = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    523     ps_mem_rec->u4_mem_size     = sizeof(iv_obj_t);
    524 
    525     ps_mem_rec++;
    526     u1_no_rec++;
    527 
    528     {
    529         /*************************************************************************/
    530         /*        Fill the memory requirement for threads context         */
    531         /*************************************************************************/
    532         /* ! */
    533         ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/;
    534         ps_mem_rec->e_mem_type      = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    535         ps_mem_rec->u4_mem_size     = sizeof(dec_state_multi_core_t);
    536 
    537         ps_mem_rec++;
    538         u1_no_rec++;
    539     }
    540 
    541     for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++)
    542     {
    543         /*************************************************************************/
    544         /*          Fill the memory requirement for MPEG2 Decoder Context        */
    545         /*************************************************************************/
    546         /* ! */
    547         ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/;
    548         ps_mem_rec->e_mem_type      = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    549         ps_mem_rec->u4_mem_size     = sizeof(dec_state_t);
    550 
    551         ps_mem_rec++;
    552         u1_no_rec++;
    553 
    554         /* To store thread handle */
    555         ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/;
    556         ps_mem_rec->e_mem_type      = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    557         ps_mem_rec->u4_mem_size     = ithread_get_handle_size();
    558 
    559         ps_mem_rec++;
    560         u1_no_rec++;
    561 
    562         /*************************************************************************/
    563         /*      Fill the memory requirement for Motion Compensation Buffers      */
    564         /*************************************************************************/
    565         ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/;
    566         ps_mem_rec->e_mem_type      = IV_EXTERNAL_CACHEABLE_SCRATCH_MEM;
    567 
    568         /* for mc_fw_buf.pu1_y */
    569         ps_mem_rec->u4_mem_size     = MB_LUMA_MEM_SIZE;
    570 
    571         /* for mc_fw_buf.pu1_u */
    572         ps_mem_rec->u4_mem_size    += MB_CHROMA_MEM_SIZE;
    573 
    574         /* for mc_fw_buf.pu1_v */
    575         ps_mem_rec->u4_mem_size    += MB_CHROMA_MEM_SIZE;
    576 
    577         /* for mc_bk_buf.pu1_y */
    578         ps_mem_rec->u4_mem_size    += MB_LUMA_MEM_SIZE;
    579 
    580         /* for mc_bk_buf.pu1_u */
    581         ps_mem_rec->u4_mem_size    += MB_CHROMA_MEM_SIZE;
    582 
    583         /* for mc_bk_buf.pu1_v */
    584         ps_mem_rec->u4_mem_size    += MB_CHROMA_MEM_SIZE;
    585 
    586         /* for mc_buf.pu1_y */
    587         ps_mem_rec->u4_mem_size    += MB_LUMA_MEM_SIZE;
    588 
    589         /* for mc_buf.pu1_u */
    590         ps_mem_rec->u4_mem_size    += MB_CHROMA_MEM_SIZE;
    591 
    592         /* for mc_buf.pu1_v */
    593         ps_mem_rec->u4_mem_size    += MB_CHROMA_MEM_SIZE;
    594 
    595         ps_mem_rec++;
    596         u1_no_rec++;
    597 
    598 
    599         /*************************************************************************/
    600         /*             Fill the memory requirement Stack Context                 */
    601         /*************************************************************************/
    602         /* ! */
    603         ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/;
    604         ps_mem_rec->e_mem_type      = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    605         ps_mem_rec->u4_mem_size     = 392;
    606 
    607         ps_mem_rec++;
    608         u1_no_rec++;
    609     }
    610 
    611 
    612 
    613     {
    614         /*************************************************************************/
    615         /*        Fill the memory requirement for Picture Buffer Manager         */
    616         /*************************************************************************/
    617         /* ! */
    618         ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/;
    619         ps_mem_rec->e_mem_type      = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    620         ps_mem_rec->u4_mem_size     = sizeof(buf_mgr_t) + sizeof(pic_buf_t) * BUF_MGR_MAX_CNT;
    621 
    622         ps_mem_rec++;
    623         u1_no_rec++;
    624     }
    625     /*************************************************************************/
    626     /*             Internal Frame Buffers                                    */
    627     /*************************************************************************/
    628 /* ! */
    629 
    630     {
    631         for(u4_i = 0; u4_i < NUM_INT_FRAME_BUFFERS; u4_i++)
    632         {
    633             /* ! */
    634             ps_mem_rec->u4_mem_alignment = 128 /* 128 byte alignment*/;
    635             ps_mem_rec->e_mem_type      = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    636             if(0 == i4_share_disp_buf)
    637                 ps_mem_rec->u4_mem_size     = max_frm_size;
    638             else if(IV_YUV_420P != i4_chroma_format)
    639             {
    640                 /* If color format is not 420P and it is shared, then allocate for chroma */
    641                 ps_mem_rec->u4_mem_size     = i4_chroma_size * 2;
    642             }
    643             else
    644                 ps_mem_rec->u4_mem_size     = 64;
    645             ps_mem_rec++;
    646             u1_no_rec++;
    647         }
    648     }
    649 
    650     ps_mem_rec->u4_mem_alignment = 128;
    651     ps_mem_rec->e_mem_type       = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    652     ps_mem_rec->u4_mem_size      = MAX_BITSTREAM_BUFFER_SIZE + MIN_BUFFER_BYTES_AT_EOS;
    653     ps_mem_rec++;
    654     u1_no_rec++;
    655 
    656     {
    657         WORD32 i4_job_queue_size;
    658         WORD32 i4_num_jobs;
    659 
    660         /* One job per row of MBs */
    661         i4_num_jobs  = max_frm_height >> 4;
    662 
    663         /* One format convert/frame copy job per row of MBs for non-shared mode*/
    664         i4_num_jobs  += max_frm_height >> 4;
    665 
    666 
    667         i4_job_queue_size = impeg2_jobq_ctxt_size();
    668         i4_job_queue_size += i4_num_jobs * sizeof(job_t);
    669         ps_mem_rec->u4_mem_size = i4_job_queue_size;
    670         ps_mem_rec->u4_mem_alignment = 128;
    671         ps_mem_rec->e_mem_type       = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    672 
    673         ps_mem_rec++;
    674         u1_no_rec++;
    675 
    676     }
    677 
    678     ps_mem_rec->u4_mem_alignment = 128;
    679     ps_mem_rec->e_mem_type       = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    680     ps_mem_rec->u4_mem_size      = impeg2d_deint_ctxt_size();
    681     ps_mem_rec++;
    682     u1_no_rec++;
    683 
    684     ps_mem_rec->u4_mem_alignment = 128;
    685     ps_mem_rec->e_mem_type       = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    686 
    687     if(IV_YUV_420P != i4_chroma_format)
    688         ps_mem_rec->u4_mem_size  = max_frm_size;
    689     else
    690         ps_mem_rec->u4_mem_size  = 64;
    691 
    692     ps_mem_rec++;
    693     u1_no_rec++;
    694 
    695     ps_mem_rec->u4_mem_alignment = 128;
    696     ps_mem_rec->e_mem_type       = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
    697     ps_mem_rec->u4_mem_size      = sizeof(iv_mem_rec_t) * (NUM_MEM_RECORDS);
    698     ps_mem_rec++;
    699     u1_no_rec++;
    700 
    701     ps_op->s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled = u1_no_rec;
    702     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code = 0;
    703 }
    704 
    705 
    706 /*****************************************************************************/
    707 /*                                                                           */
    708 /*  Function Name : impeg2d_api_get_version                                  */
    709 /*                                                                           */
    710 /*  Description   :                                                          */
    711 /*                                                                           */
    712 /*  Inputs        :                                                          */
    713 /*  Globals       : <Does it use any global variables?>                      */
    714 /*  Outputs       :                                                          */
    715 /*  Returns       : void                                                     */
    716 /*                                                                           */
    717 /*  Issues        : none                                                     */
    718 /*                                                                           */
    719 /*  Revision History:                                                        */
    720 /*                                                                           */
    721 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    722 /*         22 10 2008    100356         Draft                                */
    723 /*                                                                           */
    724 /*****************************************************************************/
    725 IV_API_CALL_STATUS_T impeg2d_api_get_version(iv_obj_t *ps_dechdl,
    726                                              void *pv_api_ip,
    727                                              void *pv_api_op)
    728 {
    729     char au1_version_string[512];
    730 
    731     impeg2d_ctl_getversioninfo_ip_t *ps_ip;
    732     impeg2d_ctl_getversioninfo_op_t *ps_op;
    733 
    734     UNUSED(ps_dechdl);
    735 
    736     ps_ip = (impeg2d_ctl_getversioninfo_ip_t *)pv_api_ip;
    737     ps_op = (impeg2d_ctl_getversioninfo_op_t *)pv_api_op;
    738 
    739     ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = IV_SUCCESS;
    740 
    741     VERSION(au1_version_string, CODEC_NAME, CODEC_RELEASE_TYPE, CODEC_RELEASE_VER,
    742             CODEC_VENDOR);
    743 
    744     if((WORD32)ps_ip->s_ivd_ctl_getversioninfo_ip_t.u4_version_buffer_size <= 0)
    745     {
    746         ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = IV_FAIL;
    747         return (IV_FAIL);
    748     }
    749 
    750     if(ps_ip->s_ivd_ctl_getversioninfo_ip_t.u4_version_buffer_size
    751                     >= (strlen(au1_version_string) + 1))
    752     {
    753         memcpy(ps_ip->s_ivd_ctl_getversioninfo_ip_t.pv_version_buffer,
    754                au1_version_string, (strlen(au1_version_string) + 1));
    755         ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = IV_SUCCESS;
    756     }
    757     else
    758     {
    759         ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code = IV_FAIL;
    760     }
    761 
    762     return (IV_SUCCESS);
    763 }
    764 
    765 /*****************************************************************************/
    766 /*                                                                           */
    767 /*  Function Name : impeg2d_api_get_buf_info                                 */
    768 /*                                                                           */
    769 /*  Description   :                                                          */
    770 /*                                                                           */
    771 /*  Inputs        :                                                          */
    772 /*  Globals       : <Does it use any global variables?>                      */
    773 /*  Outputs       :                                                          */
    774 /*  Returns       : void                                                     */
    775 /*                                                                           */
    776 /*  Issues        : none                                                     */
    777 /*                                                                           */
    778 /*  Revision History:                                                        */
    779 /*                                                                           */
    780 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    781 /*         22 10 2008    100356         Draft                                */
    782 /*                                                                           */
    783 /*****************************************************************************/
    784 IV_API_CALL_STATUS_T impeg2d_api_get_buf_info(iv_obj_t *ps_dechdl,
    785                                               void *pv_api_ip,
    786                                               void *pv_api_op)
    787 {
    788     dec_state_t *ps_dec_state;
    789     dec_state_multi_core_t *ps_dec_state_multi_core;
    790     impeg2d_ctl_getbufinfo_ip_t *ps_ctl_bufinfo_ip =
    791                     (impeg2d_ctl_getbufinfo_ip_t *)pv_api_ip;
    792     impeg2d_ctl_getbufinfo_op_t *ps_ctl_bufinfo_op =
    793                     (impeg2d_ctl_getbufinfo_op_t *)pv_api_op;
    794     UWORD32 u4_i, u4_stride, u4_height;
    795     UNUSED(ps_ctl_bufinfo_ip);
    796 
    797     ps_dec_state_multi_core =
    798                     (dec_state_multi_core_t *)(ps_dechdl->pv_codec_handle);
    799     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
    800 
    801     ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_in_bufs = 1;
    802     ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_out_bufs = 1;
    803 
    804     for(u4_i = 0; u4_i < IVD_VIDDEC_MAX_IO_BUFFERS; u4_i++)
    805     {
    806         ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_in_buf_size[u4_i] =
    807                         0;
    808         ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[u4_i] =
    809                         0;
    810     }
    811 
    812     for(u4_i = 0;
    813         u4_i < ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_in_bufs;
    814         u4_i++)
    815     {
    816         ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_in_buf_size[u4_i] =
    817                         MAX_BITSTREAM_BUFFER_SIZE;
    818     }
    819 
    820     if (0 == ps_dec_state->u4_frm_buf_stride)
    821     {
    822         if (1 == ps_dec_state->u2_header_done)
    823         {
    824             u4_stride   = ps_dec_state->u2_horizontal_size;
    825         }
    826         else
    827         {
    828             u4_stride   = ps_dec_state->u2_create_max_width;
    829         }
    830     }
    831     else
    832     {
    833         u4_stride = ps_dec_state->u4_frm_buf_stride;
    834     }
    835     u4_stride = ALIGN16(u4_stride);
    836     u4_height = ALIGN32(ps_dec_state->u2_frame_height) + 9;
    837 
    838     ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_out_bufs =
    839                     impeg2d_get_outbuf_size(
    840                                     u4_stride,
    841                                     u4_height,
    842                                     ps_dec_state->i4_chromaFormat,
    843                                     &ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_out_buf_size[0]);
    844 
    845     if (0 == ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_min_num_out_bufs)
    846     {
    847         //Invalid chroma format; Error code may be updated, verify in testing if needed
    848         ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code =
    849                         IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED;
    850         return IV_FAIL;
    851     }
    852 
    853     /* Adding initialization for 2 uninitialized values */
    854     ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_num_disp_bufs = 1;
    855     if(ps_dec_state->u4_share_disp_buf)
    856         ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_num_disp_bufs =
    857                         NUM_INT_FRAME_BUFFERS;
    858     ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_size = MAX_FRM_SIZE;
    859 
    860     ps_ctl_bufinfo_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code = IV_SUCCESS;
    861 
    862     return (IV_SUCCESS);
    863 }
    864 
    865 /*****************************************************************************/
    866 /*                                                                           */
    867 /*  Function Name :  impeg2d_api_set_flush_mode                              */
    868 /*                                                                           */
    869 /*  Description   :                                                          */
    870 /*                                                                           */
    871 /*  Inputs        :                                                          */
    872 /*  Globals       : <Does it use any global variables?>                      */
    873 /*  Outputs       :                                                          */
    874 /*  Returns       : void                                                     */
    875 /*                                                                           */
    876 /*  Issues        : none                                                     */
    877 /*                                                                           */
    878 /*  Revision History:                                                        */
    879 /*                                                                           */
    880 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    881 /*         08 06 2009    100356         RAVI                                 */
    882 /*                                                                           */
    883 /*****************************************************************************/
    884 IV_API_CALL_STATUS_T impeg2d_api_set_flush_mode(iv_obj_t *ps_dechdl,
    885                                                 void *pv_api_ip,
    886                                                 void *pv_api_op)
    887 {
    888     dec_state_t *ps_dec_state;
    889     dec_state_multi_core_t *ps_dec_state_multi_core;
    890     impeg2d_ctl_flush_op_t *ps_ctl_dec_op =
    891                     (impeg2d_ctl_flush_op_t*)pv_api_op;
    892 
    893     UNUSED(pv_api_ip);
    894 
    895     ps_dec_state_multi_core =
    896                     (dec_state_multi_core_t *)(ps_dechdl->pv_codec_handle);
    897     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
    898 
    899     ps_dec_state->u1_flushfrm = 1;
    900 
    901     ps_ctl_dec_op->s_ivd_ctl_flush_op_t.u4_size =
    902                     sizeof(impeg2d_ctl_flush_op_t);
    903     ps_ctl_dec_op->s_ivd_ctl_flush_op_t.u4_error_code = IV_SUCCESS;
    904 
    905     return (IV_SUCCESS);
    906 }
    907 
    908 /*****************************************************************************/
    909 /*                                                                           */
    910 /*  Function Name :  impeg2d_api_set_default                                 */
    911 /*                                                                           */
    912 /*  Description   :                                                          */
    913 /*                                                                           */
    914 /*  Inputs        :                                                          */
    915 /*  Globals       : <Does it use any global variables?>                      */
    916 /*  Outputs       :                                                          */
    917 /*  Returns       : void                                                     */
    918 /*                                                                           */
    919 /*  Issues        : none                                                     */
    920 /*                                                                           */
    921 /*  Revision History:                                                        */
    922 /*                                                                           */
    923 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    924 /*         08 06 2009    100356         RAVI                                 */
    925 /*                                                                           */
    926 /*****************************************************************************/
    927 IV_API_CALL_STATUS_T impeg2d_api_set_default(iv_obj_t *ps_dechdl,
    928                                              void *pv_api_ip,
    929                                              void *pv_api_op)
    930 {
    931     dec_state_t *ps_dec_state;
    932     dec_state_multi_core_t *ps_dec_state_multi_core;
    933     impeg2d_ctl_set_config_op_t *ps_ctl_dec_op =
    934                     (impeg2d_ctl_set_config_op_t *)pv_api_op;
    935 
    936     UNUSED(pv_api_ip);
    937 
    938     ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code  = IV_SUCCESS;
    939     ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_size        =
    940                     sizeof(impeg2d_ctl_set_config_op_t);
    941 
    942     ps_dec_state_multi_core =
    943                     (dec_state_multi_core_t *)(ps_dechdl->pv_codec_handle);
    944     ps_dec_state            = ps_dec_state_multi_core->ps_dec_state[0];
    945 
    946     ps_dec_state->u1_flushfrm   = 0;
    947     ps_dec_state->u2_decode_header = 1;
    948 
    949     if (1 == ps_dec_state->u2_header_done)
    950     {
    951         ps_dec_state->u4_frm_buf_stride = ps_dec_state->u2_frame_width;
    952     }
    953 
    954     ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_SUCCESS;
    955 
    956     return (IV_SUCCESS);
    957 
    958 }
    959 
    960 /*****************************************************************************/
    961 /*                                                                           */
    962 /*  Function Name :  impeg2d_api_reset                                       */
    963 /*                                                                           */
    964 /*  Description   :                                                          */
    965 /*                                                                           */
    966 /*  Inputs        :                                                          */
    967 /*  Globals       : <Does it use any global variables?>                      */
    968 /*  Outputs       :                                                          */
    969 /*  Returns       : void                                                     */
    970 /*                                                                           */
    971 /*  Issues        : none                                                     */
    972 /*                                                                           */
    973 /*  Revision History:                                                        */
    974 /*                                                                           */
    975 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    976 /*         08 06 2009    100356         RAVI                                 */
    977 /*                                                                           */
    978 /*****************************************************************************/
    979 IV_API_CALL_STATUS_T impeg2d_api_reset(iv_obj_t *ps_dechdl,
    980                                        void *pv_api_ip,
    981                                        void *pv_api_op)
    982 {
    983     dec_state_t *ps_dec_state;
    984     dec_state_multi_core_t *ps_dec_state_multi_core;
    985     UNUSED(pv_api_ip);
    986     impeg2d_ctl_reset_op_t *s_ctl_reset_op = (impeg2d_ctl_reset_op_t *)pv_api_op;
    987 
    988     WORD32 i4_num_threads;
    989 
    990     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
    991     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
    992 
    993     if(ps_dec_state_multi_core != NULL)
    994     {
    995         impeg2_buf_mgr_reset(ps_dec_state->pv_pic_buf_mg);
    996         /* Display buffer manager init behaves like a reset
    997          * as it doesn't need to preserve picture buffer addresses
    998          * like buffer manager */
    999         impeg2_disp_mgr_init(&ps_dec_state->s_disp_mgr);
   1000 
   1001         for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++)
   1002         {
   1003             ps_dec_state = ps_dec_state_multi_core->ps_dec_state[i4_num_threads];
   1004 
   1005 
   1006             /* --------------------------------------------------------------------- */
   1007             /* Initializations */
   1008 
   1009             ps_dec_state->u2_header_done    = 0;  /* Header decoding not done */
   1010             ps_dec_state->u4_frm_buf_stride = 0;
   1011             ps_dec_state->i4_pic_count      = 0;
   1012             ps_dec_state->u2_is_mpeg2       = 0;
   1013             ps_dec_state->aps_ref_pics[0] = NULL;
   1014             ps_dec_state->aps_ref_pics[1] = NULL;
   1015             ps_dec_state->ps_deint_pic = NULL;
   1016         }
   1017     }
   1018     else
   1019     {
   1020         s_ctl_reset_op->s_ivd_ctl_reset_op_t.u4_error_code =
   1021                         IMPEG2D_INIT_NOT_DONE;
   1022     }
   1023 
   1024     return(IV_SUCCESS);
   1025 }
   1026 
   1027 /*****************************************************************************/
   1028 /*                                                                           */
   1029 /*  Function Name :  impeg2d_api_set_params                                  */
   1030 /*                                                                           */
   1031 /*  Description   :                                                          */
   1032 /*                                                                           */
   1033 /*  Inputs        :                                                          */
   1034 /*  Globals       : <Does it use any global variables?>                      */
   1035 /*  Outputs       :                                                          */
   1036 /*  Returns       : void                                                     */
   1037 /*                                                                           */
   1038 /*  Issues        : none                                                     */
   1039 /*                                                                           */
   1040 /*  Revision History:                                                        */
   1041 /*                                                                           */
   1042 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1043 /*         08 06 2009    100356         RAVI                                 */
   1044 /*                                                                           */
   1045 /*****************************************************************************/
   1046 IV_API_CALL_STATUS_T impeg2d_api_set_params(iv_obj_t *ps_dechdl,void *pv_api_ip,void *pv_api_op)
   1047 {
   1048     dec_state_t *ps_dec_state;
   1049     dec_state_multi_core_t *ps_dec_state_multi_core;
   1050     impeg2d_ctl_set_config_ip_t  *ps_ctl_dec_ip = (impeg2d_ctl_set_config_ip_t  *)pv_api_ip;
   1051     impeg2d_ctl_set_config_op_t  *ps_ctl_dec_op = (impeg2d_ctl_set_config_op_t  *)pv_api_op;
   1052 
   1053     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
   1054     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
   1055 
   1056     if((ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_vid_dec_mode != IVD_DECODE_HEADER) && (ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_vid_dec_mode != IVD_DECODE_FRAME))
   1057     {
   1058         ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_FAIL;
   1059         return(IV_FAIL);
   1060     }
   1061 
   1062     if((ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_frm_out_mode != IVD_DISPLAY_FRAME_OUT) && (ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_frm_out_mode != IVD_DECODE_FRAME_OUT))
   1063     {
   1064         ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_FAIL;
   1065         return(IV_FAIL);
   1066     }
   1067 
   1068     if( (WORD32) ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_frm_skip_mode < IVD_SKIP_NONE)
   1069     {
   1070         ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_FAIL;
   1071         return(IV_FAIL);
   1072     }
   1073 
   1074     if(ps_dec_state->u2_header_done == 1)
   1075     {
   1076         if(((WORD32)ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd < 0) ||
   1077             ((ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd != 0) && (ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd < ps_dec_state->u2_frame_width)))
   1078         {
   1079             ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_FAIL;
   1080             return(IV_FAIL);
   1081         }
   1082 
   1083     }
   1084 
   1085 
   1086     ps_dec_state->u2_decode_header    = (UWORD8)ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_vid_dec_mode;
   1087 
   1088     if(ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd != 0)
   1089     {
   1090         ps_dec_state->u4_frm_buf_stride = ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd;
   1091     }
   1092     else
   1093     {
   1094 
   1095             if(ps_dec_state->u2_header_done == 1)
   1096             {
   1097                 ps_dec_state->u4_frm_buf_stride = ps_dec_state->u2_frame_width;
   1098             }
   1099             else
   1100             {
   1101                 ps_dec_state->u4_frm_buf_stride = 0;
   1102             }
   1103     }
   1104 
   1105 
   1106         if(ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.e_vid_dec_mode  == IVD_DECODE_FRAME)
   1107         {
   1108             ps_dec_state->u1_flushfrm = 0;
   1109         }
   1110 
   1111 
   1112     ps_ctl_dec_op->s_ivd_ctl_set_config_op_t.u4_error_code = IV_SUCCESS;
   1113     return(IV_SUCCESS);
   1114 
   1115 }
   1116 
   1117 /*****************************************************************************/
   1118 /*                                                                           */
   1119 /*  Function Name :  impeg2d_api_get_status                                  */
   1120 /*                                                                           */
   1121 /*  Description   :                                                          */
   1122 /*                                                                           */
   1123 /*  Inputs        :                                                          */
   1124 /*  Globals       : <Does it use any global variables?>                      */
   1125 /*  Outputs       :                                                          */
   1126 /*  Returns       : void                                                     */
   1127 /*                                                                           */
   1128 /*  Issues        : none                                                     */
   1129 /*                                                                           */
   1130 /*  Revision History:                                                        */
   1131 /*                                                                           */
   1132 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1133 /*         08 06 2009    100356         RAVI                                 */
   1134 /*                                                                           */
   1135 /*****************************************************************************/
   1136 IV_API_CALL_STATUS_T impeg2d_api_get_status(iv_obj_t *ps_dechdl,
   1137                                                   void *pv_api_ip,
   1138                                                   void *pv_api_op)
   1139 {
   1140     dec_state_t *ps_dec_state;
   1141     dec_state_multi_core_t *ps_dec_state_multi_core;
   1142     UWORD32 u4_i,u4_stride,u4_height;
   1143     impeg2d_ctl_getstatus_ip_t *ps_ctl_dec_ip = (impeg2d_ctl_getstatus_ip_t *)pv_api_ip;
   1144     impeg2d_ctl_getstatus_op_t *ps_ctl_dec_op = (impeg2d_ctl_getstatus_op_t *)pv_api_op;
   1145     UNUSED(ps_ctl_dec_ip);
   1146 
   1147     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
   1148     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
   1149 
   1150     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_size             = sizeof(impeg2d_ctl_getstatus_op_t);
   1151     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_num_disp_bufs    = 1;
   1152     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_pic_ht           = ps_dec_state->u2_frame_height;
   1153     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_pic_wd           = ps_dec_state->u2_frame_width;
   1154     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_frame_rate           = ps_dec_state->u2_framePeriod;
   1155 
   1156 
   1157     if(ps_dec_state->u2_progressive_sequence == 1)
   1158         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.e_content_type          =   IV_PROGRESSIVE ;
   1159     else
   1160         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.e_content_type          = IV_INTERLACED;
   1161 
   1162 
   1163     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.e_output_chroma_format  = (IV_COLOR_FORMAT_T)ps_dec_state->i4_chromaFormat;
   1164     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_in_bufs          = 1;
   1165     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_out_bufs     = 1;
   1166 
   1167 
   1168     if(ps_dec_state->i4_chromaFormat == IV_YUV_420P)
   1169     {
   1170         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_out_bufs     = MIN_OUT_BUFS_420;
   1171     }
   1172     else if(ps_dec_state->i4_chromaFormat == IV_YUV_422ILE)
   1173     {
   1174         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_out_bufs     = MIN_OUT_BUFS_422ILE;
   1175     }
   1176     else if(ps_dec_state->i4_chromaFormat == IV_RGB_565)
   1177     {
   1178         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_out_bufs = MIN_OUT_BUFS_RGB565;
   1179     }
   1180     else
   1181     {
   1182         //Invalid chroma format; Error code may be updated, verify in testing if needed
   1183         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_error_code   = IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED;
   1184         return IV_FAIL;
   1185     }
   1186 
   1187     memset(&ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_in_buf_size[0],0,(sizeof(UWORD32)*IVD_VIDDEC_MAX_IO_BUFFERS));
   1188     memset(&ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[0],0,(sizeof(UWORD32)*IVD_VIDDEC_MAX_IO_BUFFERS));
   1189 
   1190     for(u4_i = 0; u4_i < ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_num_in_bufs; u4_i++)
   1191     {
   1192         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_in_buf_size[u4_i] = MAX_BITSTREAM_BUFFER_SIZE;
   1193     }
   1194 
   1195     u4_stride = ps_dec_state->u4_frm_buf_stride;
   1196     u4_height = ((ps_dec_state->u2_frame_height + 15) >> 4) << 4;
   1197 
   1198     if(ps_dec_state->i4_chromaFormat == IV_YUV_420P)
   1199     {
   1200         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[0] = (u4_stride * u4_height);
   1201         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[1] = (u4_stride * u4_height)>>2 ;
   1202         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[2] = (u4_stride * u4_height)>>2;
   1203     }
   1204     else if((ps_dec_state->i4_chromaFormat == IV_YUV_420SP_UV) || (ps_dec_state->i4_chromaFormat == IV_YUV_420SP_VU))
   1205     {
   1206         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[0] = (u4_stride * u4_height);
   1207         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[1] = (u4_stride * u4_height)>>1 ;
   1208         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[2] = 0;
   1209     }
   1210     else if(ps_dec_state->i4_chromaFormat == IV_YUV_422ILE)
   1211     {
   1212         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[0] = (u4_stride * u4_height)*2;
   1213         ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[1] = ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_min_out_buf_size[2] = 0;
   1214     }
   1215 
   1216     ps_ctl_dec_op->s_ivd_ctl_getstatus_op_t.u4_error_code = IV_SUCCESS;
   1217 
   1218     return(IV_SUCCESS);
   1219 
   1220 }
   1221 
   1222 /**
   1223 *******************************************************************************
   1224 *
   1225 * @brief
   1226 *  Gets frame dimensions/offsets
   1227 *
   1228 * @par Description:
   1229 *  Gets frame buffer chararacteristics such a x & y offsets  display and
   1230 * buffer dimensions
   1231 *
   1232 * @param[in] ps_codec_obj
   1233 *  Pointer to codec object at API level
   1234 *
   1235 * @param[in] pv_api_ip
   1236 *  Pointer to input argument structure
   1237 *
   1238 * @param[out] pv_api_op
   1239 *  Pointer to output argument structure
   1240 *
   1241 * @returns  Status
   1242 *
   1243 * @remarks
   1244 *
   1245 *
   1246 *******************************************************************************
   1247 */
   1248 IV_API_CALL_STATUS_T impeg2d_get_frame_dimensions(iv_obj_t *ps_codec_obj,
   1249                                    void *pv_api_ip,
   1250                                    void *pv_api_op)
   1251 {
   1252     impeg2d_ctl_get_frame_dimensions_ip_t *ps_ip;
   1253     impeg2d_ctl_get_frame_dimensions_op_t *ps_op;
   1254     WORD32 disp_wd, disp_ht, buffer_wd, buffer_ht, x_offset, y_offset;
   1255     dec_state_t *ps_codec;
   1256     dec_state_multi_core_t *ps_dec_state_multi_core;
   1257 
   1258     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_codec_obj->pv_codec_handle);
   1259     ps_codec = ps_dec_state_multi_core->ps_dec_state[0];
   1260 
   1261 
   1262     ps_ip = (impeg2d_ctl_get_frame_dimensions_ip_t *)pv_api_ip;
   1263     ps_op = (impeg2d_ctl_get_frame_dimensions_op_t *)pv_api_op;
   1264     UNUSED(ps_ip);
   1265     if(ps_codec->u2_header_done)
   1266     {
   1267         disp_wd = ps_codec->u2_horizontal_size;
   1268         disp_ht = ps_codec->u2_vertical_size;
   1269 
   1270         if(0 == ps_codec->u4_share_disp_buf)
   1271         {
   1272             buffer_wd = disp_wd;
   1273             buffer_ht = disp_ht;
   1274         }
   1275         else
   1276         {
   1277             buffer_wd = ps_codec->u2_frame_width;
   1278             buffer_ht = ps_codec->u2_frame_height;
   1279         }
   1280     }
   1281     else
   1282     {
   1283 
   1284         disp_wd = ps_codec->u2_create_max_width;
   1285         disp_ht = ps_codec->u2_create_max_height;
   1286 
   1287         if(0 == ps_codec->u4_share_disp_buf)
   1288         {
   1289             buffer_wd = disp_wd;
   1290             buffer_ht = disp_ht;
   1291         }
   1292         else
   1293         {
   1294             buffer_wd = ALIGN16(disp_wd);
   1295             buffer_ht = ALIGN16(disp_ht);
   1296 
   1297         }
   1298     }
   1299     if(ps_codec->u2_frame_width > buffer_wd)
   1300         buffer_wd = ps_codec->u2_frame_width;
   1301 
   1302     x_offset = 0;
   1303     y_offset = 0;
   1304 
   1305 
   1306     ps_op->u4_disp_wd[0] = disp_wd;
   1307     ps_op->u4_disp_ht[0] = disp_ht;
   1308     ps_op->u4_buffer_wd[0] = buffer_wd;
   1309     ps_op->u4_buffer_ht[0] = buffer_ht;
   1310     ps_op->u4_x_offset[0] = x_offset;
   1311     ps_op->u4_y_offset[0] = y_offset;
   1312 
   1313     ps_op->u4_disp_wd[1] = ps_op->u4_disp_wd[2] = ((ps_op->u4_disp_wd[0] + 1)
   1314                     >> 1);
   1315     ps_op->u4_disp_ht[1] = ps_op->u4_disp_ht[2] = ((ps_op->u4_disp_ht[0] + 1)
   1316                     >> 1);
   1317     ps_op->u4_buffer_wd[1] = ps_op->u4_buffer_wd[2] = (ps_op->u4_buffer_wd[0]
   1318                     >> 1);
   1319     ps_op->u4_buffer_ht[1] = ps_op->u4_buffer_ht[2] = (ps_op->u4_buffer_ht[0]
   1320                     >> 1);
   1321     ps_op->u4_x_offset[1] = ps_op->u4_x_offset[2] = (ps_op->u4_x_offset[0]
   1322                     >> 1);
   1323     ps_op->u4_y_offset[1] = ps_op->u4_y_offset[2] = (ps_op->u4_y_offset[0]
   1324                     >> 1);
   1325 
   1326     if((ps_codec->i4_chromaFormat == IV_YUV_420SP_UV)
   1327                     || (ps_codec->i4_chromaFormat == IV_YUV_420SP_VU))
   1328     {
   1329         ps_op->u4_disp_wd[2] = 0;
   1330         ps_op->u4_disp_ht[2] = 0;
   1331         ps_op->u4_buffer_wd[2] = 0;
   1332         ps_op->u4_buffer_ht[2] = 0;
   1333         ps_op->u4_x_offset[2] = 0;
   1334         ps_op->u4_y_offset[2] = 0;
   1335 
   1336         ps_op->u4_disp_wd[1] <<= 1;
   1337         ps_op->u4_buffer_wd[1] <<= 1;
   1338         ps_op->u4_x_offset[1] <<= 1;
   1339     }
   1340 
   1341     return IV_SUCCESS;
   1342 
   1343 }
   1344 
   1345 IV_API_CALL_STATUS_T impeg2d_api_function (iv_obj_t *ps_dechdl, void *pv_api_ip,void *pv_api_op)
   1346 {
   1347     WORD32 i4_cmd;
   1348     IV_API_CALL_STATUS_T u4_error_code;
   1349     UWORD32 *pu4_api_ip;
   1350 
   1351     u4_error_code = impeg2d_api_check_struct_sanity(ps_dechdl,pv_api_ip,pv_api_op);
   1352     if(IV_SUCCESS != u4_error_code)
   1353     {
   1354         return u4_error_code;
   1355     }
   1356 
   1357 
   1358     pu4_api_ip  = (UWORD32 *)pv_api_ip;
   1359     i4_cmd = *(pu4_api_ip + 1);
   1360 
   1361     switch(i4_cmd)
   1362     {
   1363 
   1364     case IV_CMD_GET_NUM_MEM_REC:
   1365         u4_error_code = impeg2d_api_num_mem_rec((void *)pv_api_ip,(void *)pv_api_op);
   1366         break;
   1367 
   1368     case IV_CMD_FILL_NUM_MEM_REC:
   1369         u4_error_code = impeg2d_api_fill_mem_rec((void *)pv_api_ip,(void *)pv_api_op);
   1370         break;
   1371 
   1372     case IV_CMD_INIT:
   1373         u4_error_code = impeg2d_api_init(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op);
   1374         break;
   1375 
   1376     case IVD_CMD_SET_DISPLAY_FRAME:
   1377         u4_error_code = impeg2d_api_set_display_frame(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op);
   1378         break;
   1379 
   1380     case IVD_CMD_REL_DISPLAY_FRAME:
   1381         u4_error_code = impeg2d_api_rel_display_frame(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op);
   1382         break;
   1383 
   1384     case IVD_CMD_VIDEO_DECODE:
   1385         u4_error_code = impeg2d_api_entity(ps_dechdl, (void *)pv_api_ip,(void *)pv_api_op);
   1386         break;
   1387 
   1388     case IV_CMD_RETRIEVE_MEMREC:
   1389         u4_error_code = impeg2d_api_retrieve_mem_rec(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op);
   1390         break;
   1391 
   1392     case IVD_CMD_VIDEO_CTL:
   1393         u4_error_code = impeg2d_api_ctl(ps_dechdl,(void *)pv_api_ip,(void *)pv_api_op);
   1394         break;
   1395 
   1396     default:
   1397             break;
   1398     }
   1399 
   1400     return(u4_error_code);
   1401 
   1402 }
   1403 
   1404 /*****************************************************************************/
   1405 /*                                                                           */
   1406 /*  Function Name : impeg2d_api_num_mem_rec                                  */
   1407 /*                                                                           */
   1408 /*  Description   : The function get the number mem records library needs    */
   1409 /*  Inputs        : Error message                                            */
   1410 /*  Globals       : None                                                     */
   1411 /*  Processing    : Just prints error message to console                     */
   1412 /*  Outputs       : Error mesage to the console                              */
   1413 /*  Returns       : None                                                     */
   1414 /*                                                                           */
   1415 /*  Issues        : <List any issues or problems with this function>         */
   1416 /*                                                                           */
   1417 /*  Revision History:                                                        */
   1418 /*                                                                           */
   1419 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1420 /*         23 09 2010   Hamsalekha          Creation                             */
   1421 /*                                                                           */
   1422 /*****************************************************************************/
   1423 
   1424 
   1425 IV_API_CALL_STATUS_T impeg2d_api_num_mem_rec(void *pv_api_ip,void *pv_api_op)
   1426 {
   1427     /* To Query No of Memory Records */
   1428     impeg2d_num_mem_rec_ip_t *ps_query_mem_rec_ip;
   1429     impeg2d_num_mem_rec_op_t *ps_query_mem_rec_op;
   1430 
   1431     ps_query_mem_rec_ip = (impeg2d_num_mem_rec_ip_t *)pv_api_ip;
   1432     ps_query_mem_rec_op = (impeg2d_num_mem_rec_op_t *)pv_api_op;
   1433 
   1434     UNUSED(ps_query_mem_rec_ip);
   1435     ps_query_mem_rec_op->s_ivd_num_mem_rec_op_t.u4_size = sizeof(impeg2d_num_mem_rec_op_t);
   1436 
   1437     ps_query_mem_rec_op->s_ivd_num_mem_rec_op_t.u4_num_mem_rec  = (UWORD32)NUM_MEM_RECORDS;
   1438 
   1439     ps_query_mem_rec_op->s_ivd_num_mem_rec_op_t.u4_error_code = IV_SUCCESS;
   1440 
   1441 
   1442     return(IV_SUCCESS);
   1443 
   1444 }
   1445 
   1446 
   1447 /*****************************************************************************/
   1448 /*                                                                           */
   1449 /*  Function Name : impeg2d_api_fill_mem_rec                                 */
   1450 /*                                                                           */
   1451 /*  Description   : Thsi functions fills details of each mem record lib needs*/
   1452 /*  Inputs        : Error message                                            */
   1453 /*  Globals       : None                                                     */
   1454 /*  Processing    : Just prints error message to console                     */
   1455 /*  Outputs       : Error mesage to the console                              */
   1456 /*  Returns       : None                                                     */
   1457 /*                                                                           */
   1458 /*  Issues        : <List any issues or problems with this function>         */
   1459 /*                                                                           */
   1460 /*  Revision History:                                                        */
   1461 /*                                                                           */
   1462 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1463 /*         23 09 2010   Hamsalekha          Creation                         */
   1464 /*                                                                           */
   1465 /*****************************************************************************/
   1466 
   1467 
   1468 IV_API_CALL_STATUS_T impeg2d_api_fill_mem_rec(void *pv_api_ip,void *pv_api_op)
   1469 {
   1470 
   1471     impeg2d_fill_mem_rec_ip_t *ps_mem_q_ip;
   1472     impeg2d_fill_mem_rec_op_t *ps_mem_q_op;
   1473 
   1474 
   1475     ps_mem_q_ip = pv_api_ip;
   1476     ps_mem_q_op = pv_api_op;
   1477 
   1478 
   1479     impeg2d_fill_mem_rec((impeg2d_fill_mem_rec_ip_t *)ps_mem_q_ip,
   1480                            (impeg2d_fill_mem_rec_op_t *)ps_mem_q_op);
   1481 
   1482 
   1483     return(IV_SUCCESS);
   1484 
   1485 }
   1486 
   1487 UWORD32 impeg2d_get_outbuf_size(WORD32 pic_wd,UWORD32 pic_ht, WORD32 u1_chroma_format,UWORD32 *p_buf_size)
   1488 {
   1489     UWORD32 u4_min_num_out_bufs = 0;
   1490     if(u1_chroma_format == IV_YUV_420P)
   1491         u4_min_num_out_bufs = MIN_OUT_BUFS_420;
   1492     else if(u1_chroma_format == IV_YUV_422ILE)
   1493         u4_min_num_out_bufs = MIN_OUT_BUFS_422ILE;
   1494     else if(u1_chroma_format == IV_RGB_565)
   1495         u4_min_num_out_bufs = MIN_OUT_BUFS_RGB565;
   1496     else if((u1_chroma_format == IV_YUV_420SP_UV)
   1497                     || (u1_chroma_format == IV_YUV_420SP_VU))
   1498         u4_min_num_out_bufs = MIN_OUT_BUFS_420SP;
   1499 
   1500     if(u1_chroma_format == IV_YUV_420P)
   1501     {
   1502         p_buf_size[0] = (pic_wd * pic_ht);
   1503         p_buf_size[1] = (pic_wd * pic_ht)
   1504                         >> 2;
   1505         p_buf_size[2] = (pic_wd * pic_ht)
   1506                         >> 2;
   1507     }
   1508     else if(u1_chroma_format == IV_YUV_422ILE)
   1509     {
   1510         p_buf_size[0] = (pic_wd * pic_ht)
   1511                         * 2;
   1512         p_buf_size[1] =
   1513                         p_buf_size[2] = 0;
   1514     }
   1515     else if(u1_chroma_format == IV_RGB_565)
   1516     {
   1517         p_buf_size[0] = (pic_wd * pic_ht)
   1518                         * 2;
   1519         p_buf_size[1] =
   1520                         p_buf_size[2] = 0;
   1521     }
   1522     else if((u1_chroma_format == IV_YUV_420SP_UV)
   1523                     || (u1_chroma_format == IV_YUV_420SP_VU))
   1524     {
   1525         p_buf_size[0] = (pic_wd * pic_ht);
   1526         p_buf_size[1] = (pic_wd * pic_ht)
   1527                         >> 1;
   1528         p_buf_size[2] = 0;
   1529     }
   1530 
   1531     return u4_min_num_out_bufs;
   1532 }
   1533 
   1534 WORD32 check_app_out_buf_size(dec_state_t *ps_dec)
   1535 {
   1536     UWORD32 au4_min_out_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
   1537     UWORD32 u4_min_num_out_bufs, i;
   1538     UWORD32 pic_wd, pic_ht;
   1539 
   1540     pic_wd = ps_dec->u2_horizontal_size;
   1541     pic_ht = ps_dec->u2_vertical_size;
   1542 
   1543     if(ps_dec->u4_frm_buf_stride > pic_wd)
   1544         pic_wd = ps_dec->u4_frm_buf_stride;
   1545 
   1546     u4_min_num_out_bufs = impeg2d_get_outbuf_size(pic_wd, pic_ht, ps_dec->i4_chromaFormat, &au4_min_out_buf_size[0]);
   1547 
   1548     if (0 == ps_dec->u4_share_disp_buf)
   1549     {
   1550         if(ps_dec->ps_out_buf->u4_num_bufs < u4_min_num_out_bufs)
   1551         {
   1552             return IV_FAIL;
   1553         }
   1554 
   1555         for (i = 0 ; i < u4_min_num_out_bufs; i++)
   1556         {
   1557             if(ps_dec->ps_out_buf->u4_min_out_buf_size[i] < au4_min_out_buf_size[i])
   1558                 return (IV_FAIL);
   1559         }
   1560     }
   1561     else
   1562     {
   1563         if(ps_dec->as_disp_buffers[0].u4_num_bufs < u4_min_num_out_bufs)
   1564             return IV_FAIL;
   1565 
   1566         for (i = 0 ; i < u4_min_num_out_bufs; i++)
   1567         {
   1568             /* We need to check only with the disp_buffer[0], because we have
   1569             * already ensured that all the buffers are of the same size in
   1570             * impeg2d_api_set_display_frame.
   1571             */
   1572             if(ps_dec->as_disp_buffers[0].u4_min_out_buf_size[i] <
   1573                    au4_min_out_buf_size[i])
   1574                 return (IV_FAIL);
   1575         }
   1576     }
   1577 
   1578     return(IV_SUCCESS);
   1579 }
   1580 
   1581 
   1582 
   1583 /*****************************************************************************/
   1584 /*                                                                           */
   1585 /*  Function Name : impeg2d_api_init                                         */
   1586 /*                                                                           */
   1587 /*  Description   :                                                          */
   1588 /*  Inputs        :                                                          */
   1589 /*  Globals       :                                                          */
   1590 /*  Processing    :                                                          */
   1591 /*  Outputs       :                                                          */
   1592 /*  Returns       :                                                          */
   1593 /*                                                                           */
   1594 /*  Issues        :                                                          */
   1595 /*                                                                           */
   1596 /*  Revision History:                                                        */
   1597 /*                                                                           */
   1598 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1599 /*         17 09 2007  Rajendra C Y          Draft                           */
   1600 /*                                                                           */
   1601 /*****************************************************************************/
   1602 IV_API_CALL_STATUS_T impeg2d_api_init(iv_obj_t *ps_dechdl,
   1603                                       void *ps_ip,
   1604                                       void *ps_op)
   1605 {
   1606     UWORD32 i;
   1607 
   1608     void *pv;
   1609     UWORD32 u4_size;
   1610 
   1611     dec_state_t *ps_dec_state;
   1612     dec_state_multi_core_t *ps_dec_state_multi_core;
   1613     UWORD32 u4_num_mem_rec;
   1614     iv_mem_rec_t *ps_mem_rec ;
   1615     iv_mem_rec_t *ps_frm_buf;
   1616     iv_obj_t *ps_dec_handle;
   1617     WORD32 i4_max_wd, i4_max_ht;
   1618 
   1619     impeg2d_init_ip_t *ps_dec_init_ip;
   1620     impeg2d_init_op_t *ps_dec_init_op;
   1621     WORD32 i4_num_threads;
   1622     UWORD32 u4_share_disp_buf, u4_chroma_format;
   1623     UWORD32 u4_deinterlace;
   1624 
   1625     ps_dec_init_ip = (impeg2d_init_ip_t *)ps_ip;
   1626     ps_dec_init_op = (impeg2d_init_op_t *)ps_op;
   1627 
   1628     i4_max_wd = ALIGN16(ps_dec_init_ip->s_ivd_init_ip_t.u4_frm_max_wd);
   1629     i4_max_ht = ALIGN16(ps_dec_init_ip->s_ivd_init_ip_t.u4_frm_max_ht);
   1630 
   1631     if(ps_dec_init_ip->s_ivd_init_ip_t.u4_size > offsetof(impeg2d_init_ip_t, u4_share_disp_buf))
   1632     {
   1633 #ifndef LOGO_EN
   1634         u4_share_disp_buf = ps_dec_init_ip->u4_share_disp_buf;
   1635 #else
   1636         u4_share_disp_buf = 0;
   1637 #endif
   1638     }
   1639     else
   1640     {
   1641         u4_share_disp_buf = 0;
   1642     }
   1643 
   1644     u4_chroma_format = ps_dec_init_ip->s_ivd_init_ip_t.e_output_format;
   1645 
   1646     if(ps_dec_init_ip->s_ivd_init_ip_t.u4_size > offsetof(impeg2d_init_ip_t, u4_deinterlace))
   1647     {
   1648         u4_deinterlace = ps_dec_init_ip->u4_deinterlace;
   1649     }
   1650     else
   1651     {
   1652         u4_deinterlace = 0;
   1653     }
   1654 
   1655     if( (u4_chroma_format != IV_YUV_420P) &&
   1656         (u4_chroma_format != IV_YUV_420SP_UV) &&
   1657         (u4_chroma_format != IV_YUV_420SP_VU))
   1658     {
   1659         u4_share_disp_buf = 0;
   1660     }
   1661 
   1662     /* Disable deinterlacer in shared mode */
   1663     if(u4_share_disp_buf)
   1664     {
   1665         u4_deinterlace = 0;
   1666     }
   1667 
   1668     ps_mem_rec = ps_dec_init_ip->s_ivd_init_ip_t.pv_mem_rec_location;
   1669     ps_mem_rec ++;
   1670 
   1671 
   1672     ps_dec_init_op->s_ivd_init_op_t.u4_size = sizeof(impeg2d_init_op_t);
   1673 
   1674 
   1675     /* Except memTab[0], all other memTabs are initialized to zero */
   1676     for(i = 1; i < ps_dec_init_ip->s_ivd_init_ip_t.u4_num_mem_rec; i++)
   1677     {
   1678         memset(ps_mem_rec->pv_base,0,ps_mem_rec->u4_mem_size);
   1679         ps_mem_rec++;
   1680     }
   1681 
   1682     /* Reinitializing memTab[0] memory base address */
   1683     ps_mem_rec     = ps_dec_init_ip->s_ivd_init_ip_t.pv_mem_rec_location;
   1684 
   1685 
   1686     /* memTab[0] is for codec Handle,redundant currently not being used */
   1687     ps_dec_handle  = ps_mem_rec->pv_base;
   1688     u4_num_mem_rec = 1;
   1689     ps_mem_rec++;
   1690 
   1691 
   1692 
   1693 
   1694 
   1695     /* decoder handle */
   1696     ps_dec_state_multi_core = ps_mem_rec->pv_base;
   1697     u4_num_mem_rec++;
   1698     ps_mem_rec++;
   1699 
   1700 
   1701     {
   1702         ps_dec_handle->pv_codec_handle = (void *)ps_dec_state_multi_core; /* Initializing codec context */
   1703 
   1704         ps_dechdl->pv_codec_handle =  (void *)ps_dec_state_multi_core;
   1705         ps_dechdl->pv_fxns = (void *)impeg2d_api_function;
   1706     }
   1707 
   1708 
   1709     for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++)
   1710     {
   1711     /*************************************************************************/
   1712     /*                      For MPEG2 Decoder Context                        */
   1713     /*************************************************************************/
   1714     ps_dec_state = ps_mem_rec->pv_base;
   1715 
   1716     ps_dec_state_multi_core->ps_dec_state[i4_num_threads] = ps_dec_state;
   1717 
   1718     ps_dec_state->ps_dec_state_multi_core = ps_dec_state_multi_core;
   1719 
   1720     ps_dec_state->i4_num_cores = 1;
   1721     /* @ */  /* Used for storing MemRecords */
   1722      u4_num_mem_rec++;
   1723      ps_mem_rec++;
   1724 
   1725      /* Thread handle */
   1726      ps_dec_state->pv_codec_thread_handle = ps_mem_rec->pv_base;
   1727      u4_num_mem_rec++;
   1728      ps_mem_rec++;
   1729 
   1730     /*************************************************************************/
   1731     /*                      For Motion Compensation Buffers                  */
   1732     /*************************************************************************/
   1733     pv = ps_mem_rec->pv_base;
   1734 
   1735     /* for mc_fw_buf.pu1_y */
   1736 
   1737     ps_dec_state->s_mc_fw_buf.pu1_y = pv;
   1738     pv = (void *)((UWORD8 *)pv + MB_LUMA_MEM_SIZE);
   1739 
   1740     u4_size = sizeof(UWORD8) * MB_LUMA_MEM_SIZE;
   1741     /* for mc_fw_buf.pu1_u */
   1742 
   1743     ps_dec_state->s_mc_fw_buf.pu1_u = pv;
   1744     pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE);
   1745 
   1746     u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE;
   1747 
   1748     /* for mc_fw_buf.pu1_v */
   1749 
   1750     ps_dec_state->s_mc_fw_buf.pu1_v = pv;
   1751     pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE);
   1752 
   1753     u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE;
   1754 
   1755     /* for mc_bk_buf.pu1_y */
   1756 
   1757     ps_dec_state->s_mc_bk_buf.pu1_y = pv;
   1758     pv = (void *)((UWORD8 *)pv + MB_LUMA_MEM_SIZE);
   1759 
   1760     u4_size += sizeof(UWORD8) * MB_LUMA_MEM_SIZE;
   1761 
   1762     /* for mc_bk_buf.pu1_u */
   1763 
   1764     ps_dec_state->s_mc_bk_buf.pu1_u = pv;
   1765     pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE);
   1766 
   1767     u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE;
   1768 
   1769     /* for mc_bk_buf.pu1_v */
   1770 
   1771     ps_dec_state->s_mc_bk_buf.pu1_v = pv;
   1772     pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE);
   1773 
   1774     u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE;
   1775 
   1776     /* for mc_buf.pu1_y */
   1777 
   1778     ps_dec_state->s_mc_buf.pu1_y = pv;
   1779     pv = (void *)((UWORD8 *)pv + MB_LUMA_MEM_SIZE);
   1780 
   1781     u4_size += sizeof(UWORD8) * MB_LUMA_MEM_SIZE;
   1782 
   1783     /* for mc_buf.pu1_u */
   1784 
   1785     ps_dec_state->s_mc_buf.pu1_u = pv;
   1786     pv = (void *)((UWORD8 *)pv + MB_CHROMA_MEM_SIZE);
   1787 
   1788     u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE;
   1789 
   1790     /* for mc_buf.pu1_v */
   1791 
   1792     ps_dec_state->s_mc_buf.pu1_v = pv;
   1793 
   1794     u4_size += sizeof(UWORD8) * MB_CHROMA_MEM_SIZE;
   1795 
   1796     u4_num_mem_rec++;
   1797     ps_mem_rec++;
   1798 
   1799 
   1800 
   1801     ps_dec_state->pv_pic_buf_mg = 0;
   1802 
   1803     /*************************************************************************/
   1804     /*        For saving stack context to support global error handling      */
   1805     /*************************************************************************/
   1806     ps_dec_state->pv_stack_cntxt = ps_mem_rec->pv_base;
   1807     u4_num_mem_rec++;
   1808     ps_mem_rec++;
   1809 
   1810     }
   1811 
   1812 
   1813 
   1814 
   1815 
   1816     /*************************************************************************/
   1817     /*                          For Picture Buffer Manager                   */
   1818     /*************************************************************************/
   1819     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
   1820 
   1821     ps_dec_state->pv_pic_buf_mg = ps_mem_rec->pv_base;
   1822     ps_dec_state->pv_pic_buf_base = (UWORD8 *)ps_mem_rec->pv_base + sizeof(buf_mgr_t);
   1823 
   1824     u4_num_mem_rec++;
   1825     ps_mem_rec++;
   1826 
   1827 
   1828 
   1829     for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++)
   1830     {
   1831 
   1832         ps_dec_state = ps_dec_state_multi_core->ps_dec_state[i4_num_threads];
   1833 
   1834 
   1835         /* --------------------------------------------------------------------- */
   1836         /* Initializations */
   1837 
   1838         ps_dec_state->u2_header_done  = 0;  /* Header decoding not done */
   1839 
   1840 
   1841         {
   1842             UWORD32 u4_max_frm_width,u4_max_frm_height;
   1843 
   1844             u4_max_frm_width = ALIGN16(ps_dec_init_ip->s_ivd_init_ip_t.u4_frm_max_wd);
   1845             u4_max_frm_height = ALIGN16(ps_dec_init_ip->s_ivd_init_ip_t.u4_frm_max_ht);
   1846 
   1847             ps_dec_state->u2_create_max_width   = u4_max_frm_width;
   1848             ps_dec_state->u2_create_max_height  = u4_max_frm_height;
   1849 
   1850             ps_dec_state->i4_chromaFormat = ps_dec_init_ip->s_ivd_init_ip_t.e_output_format;
   1851             ps_dec_state->u4_frm_buf_stride  = 0 ;
   1852             ps_dec_state->u2_frame_width  = u4_max_frm_width;
   1853             ps_dec_state->u2_picture_width  = u4_max_frm_width;
   1854             ps_dec_state->u2_horizontal_size  = u4_max_frm_width;
   1855 
   1856             ps_dec_state->u2_frame_height = u4_max_frm_height;
   1857             ps_dec_state->u2_vertical_size = u4_max_frm_height;
   1858             ps_dec_state->u4_share_disp_buf = u4_share_disp_buf;
   1859             ps_dec_state->u4_deinterlace = u4_deinterlace;
   1860             ps_dec_state->ps_deint_pic = NULL;
   1861         }
   1862     }
   1863 
   1864     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
   1865 
   1866     if((ps_dec_state->i4_chromaFormat  == IV_YUV_422ILE)
   1867         &&((ps_dec_state->u2_vertical_size & 0x1) != 0))
   1868     {
   1869         //printf("Error! Height should be multiple of 2 if Chroma format is 422ILE\n");
   1870         ps_dec_init_op->s_ivd_init_op_t.u4_error_code = IMPEG2D_INIT_CHROMA_FORMAT_HEIGHT_ERROR;
   1871         return(IV_FAIL);
   1872 
   1873 
   1874     }
   1875 
   1876     /* --------------------------------------------------------------------- */
   1877 
   1878 
   1879 /* ! */
   1880     // picture buffer manager initialization will be done only for first thread
   1881     impeg2_disp_mgr_init(&ps_dec_state->s_disp_mgr);
   1882     impeg2_buf_mgr_init((buf_mgr_t *)ps_dec_state->pv_pic_buf_mg);
   1883 
   1884     /*************************************************************************/
   1885     /*             Internal Frame Buffers                                    */
   1886     /*************************************************************************/
   1887 
   1888 
   1889     /* Set first frame to grey */
   1890     {
   1891         ps_frm_buf = ps_mem_rec;
   1892         memset(ps_frm_buf->pv_base, 128, ps_frm_buf->u4_mem_size);
   1893         ps_frm_buf++;
   1894     }
   1895 
   1896     if(0 == ps_dec_state->u4_share_disp_buf)
   1897     {
   1898         pic_buf_t *ps_pic_buf;
   1899         ps_pic_buf = (pic_buf_t *)ps_dec_state->pv_pic_buf_base;
   1900         for(i = 0; i < NUM_INT_FRAME_BUFFERS; i++)
   1901         {
   1902             UWORD8 *pu1_buf;
   1903             pu1_buf = ps_mem_rec->pv_base;
   1904 
   1905             ps_pic_buf->pu1_y = pu1_buf;
   1906             pu1_buf += i4_max_ht * i4_max_wd;
   1907 
   1908             ps_pic_buf->pu1_u = pu1_buf;
   1909             pu1_buf += i4_max_ht * i4_max_wd >> 2;
   1910 
   1911             ps_pic_buf->pu1_v = pu1_buf;
   1912             pu1_buf += i4_max_ht * i4_max_wd >> 2;
   1913 
   1914             ps_pic_buf->i4_buf_id = i;
   1915 
   1916             ps_pic_buf->u1_used_as_ref = 0;
   1917 
   1918             ps_pic_buf->u4_ts = 0;
   1919 
   1920             impeg2_buf_mgr_add(ps_dec_state->pv_pic_buf_mg, ps_pic_buf, i);
   1921             ps_mem_rec++;
   1922             ps_pic_buf++;
   1923         }
   1924         u4_num_mem_rec += NUM_INT_FRAME_BUFFERS;
   1925     }
   1926     else if (ps_dec_state->i4_chromaFormat  != IV_YUV_420P)
   1927     {
   1928         for(i = 0; i < NUM_INT_FRAME_BUFFERS; i++)
   1929         {
   1930             ps_dec_state->pu1_chroma_ref_buf[i] = ps_mem_rec->pv_base;
   1931             ps_mem_rec++;
   1932         }
   1933 
   1934         u4_num_mem_rec += NUM_INT_FRAME_BUFFERS;
   1935     }
   1936     else
   1937     {
   1938         ps_mem_rec+=NUM_INT_FRAME_BUFFERS;
   1939         u4_num_mem_rec += NUM_INT_FRAME_BUFFERS;
   1940     }
   1941 
   1942 
   1943     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
   1944 
   1945     ps_dec_state->pu1_input_buffer = ps_mem_rec->pv_base;
   1946     u4_num_mem_rec++;
   1947     ps_mem_rec++;
   1948 
   1949     ps_dec_state->pv_jobq_buf = ps_mem_rec->pv_base;
   1950     ps_dec_state->i4_jobq_buf_size = ps_mem_rec->u4_mem_size;
   1951     u4_num_mem_rec++;
   1952     ps_mem_rec++;
   1953 
   1954     if(u4_num_mem_rec > ps_dec_init_ip->s_ivd_init_ip_t.u4_num_mem_rec)
   1955     {
   1956         ps_dec_init_op->s_ivd_init_op_t.u4_error_code = IMPEG2D_INIT_NUM_MEM_REC_NOT_SUFFICIENT;
   1957         return(IV_FAIL);
   1958 
   1959     }
   1960 
   1961     ps_dec_state->u1_flushfrm = 0;
   1962     ps_dec_state->u1_flushcnt = 0;
   1963     ps_dec_state->pv_jobq = impeg2_jobq_init(ps_dec_state->pv_jobq_buf, ps_dec_state->i4_jobq_buf_size);
   1964 
   1965 
   1966     ps_dec_state->pv_deinterlacer_ctxt = ps_mem_rec->pv_base;
   1967     u4_num_mem_rec++;
   1968     ps_mem_rec++;
   1969 
   1970     ps_dec_state->pu1_deint_fmt_buf = ps_mem_rec->pv_base;
   1971     u4_num_mem_rec++;
   1972     ps_mem_rec++;
   1973 
   1974 
   1975     /*************************************************************************/
   1976     /*        Last MemTab is used for storing TabRecords                     */
   1977     /*************************************************************************/
   1978     ps_dec_state->pv_memTab     = (void *)ps_mem_rec->pv_base;
   1979     memcpy(ps_mem_rec->pv_base,ps_dec_init_ip->s_ivd_init_ip_t.pv_mem_rec_location, ps_mem_rec->u4_mem_size);
   1980     /* Updating in Decoder Context with memRecords  */
   1981     u4_num_mem_rec++;
   1982     ps_mem_rec++;
   1983     ps_dec_state->u4_num_mem_records = u4_num_mem_rec;
   1984 
   1985 
   1986     ps_dec_state->u4_num_frames_decoded    = 0;
   1987     ps_dec_state->aps_ref_pics[0] = NULL;
   1988     ps_dec_state->aps_ref_pics[1] = NULL;
   1989 
   1990     ps_dec_init_op->s_ivd_init_op_t.u4_error_code = IV_SUCCESS;
   1991 
   1992     impeg2d_init_arch(ps_dec_state);
   1993 
   1994     impeg2d_init_function_ptr(ps_dec_state);
   1995 
   1996     return(IV_SUCCESS);
   1997 }
   1998 
   1999 /*****************************************************************************/
   2000 /*                                                                           */
   2001 /*  Function Name : impeg2d_api_retrieve_mem_rec                             */
   2002 /*                                                                           */
   2003 /*  Description   :                                                          */
   2004 /*                                                                           */
   2005 /*  Inputs        :                                                          */
   2006 /*  Globals       : <Does it use any global variables?>                      */
   2007 /*  Outputs       :                                                          */
   2008 /*  Returns       : void                                                     */
   2009 /*                                                                           */
   2010 /*  Issues        : none                                                     */
   2011 /*                                                                           */
   2012 /*  Revision History:                                                        */
   2013 /*                                                                           */
   2014 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   2015 /*         22 10 2008    100356         Draft                                */
   2016 /*                                                                           */
   2017 /*****************************************************************************/
   2018 IV_API_CALL_STATUS_T impeg2d_api_retrieve_mem_rec(iv_obj_t *ps_dechdl,
   2019                                             void *pv_api_ip,
   2020                                             void *pv_api_op)
   2021 {
   2022     UWORD32 u4_i;
   2023     dec_state_t *ps_dec_state;
   2024     dec_state_multi_core_t *ps_dec_state_multi_core;
   2025     iv_mem_rec_t *ps_mem_rec;
   2026     iv_mem_rec_t *ps_temp_rec;
   2027 
   2028 
   2029 
   2030     impeg2d_retrieve_mem_rec_ip_t *ps_retr_mem_rec_ip;
   2031     impeg2d_retrieve_mem_rec_op_t *ps_retr_mem_rec_op;
   2032 
   2033     ps_retr_mem_rec_ip  = (impeg2d_retrieve_mem_rec_ip_t *)pv_api_ip;
   2034     ps_retr_mem_rec_op  = (impeg2d_retrieve_mem_rec_op_t *)pv_api_op;
   2035 
   2036     ps_mem_rec          = ps_retr_mem_rec_ip->s_ivd_retrieve_mem_rec_ip_t.pv_mem_rec_location;
   2037     ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
   2038     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
   2039     ps_temp_rec        = ps_dec_state->pv_memTab;
   2040 
   2041     for(u4_i = 0; u4_i < (ps_dec_state->u4_num_mem_records);u4_i++)
   2042     {
   2043         ps_mem_rec[u4_i].u4_mem_size        = ps_temp_rec[u4_i].u4_mem_size;
   2044         ps_mem_rec[u4_i].u4_mem_alignment   = ps_temp_rec[u4_i].u4_mem_alignment;
   2045         ps_mem_rec[u4_i].e_mem_type         = ps_temp_rec[u4_i].e_mem_type;
   2046         ps_mem_rec[u4_i].pv_base            = ps_temp_rec[u4_i].pv_base;
   2047     }
   2048 
   2049     ps_retr_mem_rec_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code       = IV_SUCCESS;
   2050     ps_retr_mem_rec_op->s_ivd_retrieve_mem_rec_op_t.u4_num_mem_rec_filled   = ps_dec_state->u4_num_mem_records;
   2051 
   2052     impeg2_jobq_deinit(ps_dec_state->pv_jobq);
   2053     IMPEG2D_PRINT_STATISTICS();
   2054 
   2055 
   2056     return(IV_SUCCESS);
   2057 
   2058 }
   2059 
   2060 /*****************************************************************************/
   2061 /*                                                                           */
   2062 /*  Function Name :   impeg2d_api_ctl                                        */
   2063 /*                                                                           */
   2064 /*  Description   :                                                          */
   2065 /*                                                                           */
   2066 /*  Inputs        :                                                          */
   2067 /*  Globals       : <Does it use any global variables?>                      */
   2068 /*  Outputs       :                                                          */
   2069 /*  Returns       : void                                                     */
   2070 /*                                                                           */
   2071 /*  Issues        : none                                                     */
   2072 /*                                                                           */
   2073 /*  Revision History:                                                        */
   2074 /*                                                                           */
   2075 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   2076 /*         22 10 2008    100356         Draft                                */
   2077 /*                                                                           */
   2078 /*****************************************************************************/
   2079 IV_API_CALL_STATUS_T impeg2d_api_ctl(iv_obj_t *ps_dechdl,
   2080                                      void *pv_api_ip,
   2081                                      void *pv_api_op)
   2082 {
   2083     WORD32 i4_sub_cmd;
   2084     UWORD32 *pu4_api_ip;
   2085     IV_API_CALL_STATUS_T u4_error_code;
   2086 
   2087     pu4_api_ip = (UWORD32 *)pv_api_ip;
   2088     i4_sub_cmd = *(pu4_api_ip + 2);
   2089 
   2090     switch(i4_sub_cmd)
   2091     {
   2092         case IVD_CMD_CTL_GETPARAMS:
   2093             u4_error_code = impeg2d_api_get_status(ps_dechdl, (void *)pv_api_ip,
   2094                                                    (void *)pv_api_op);
   2095             break;
   2096 
   2097         case IVD_CMD_CTL_SETPARAMS:
   2098             u4_error_code = impeg2d_api_set_params(ps_dechdl, (void *)pv_api_ip,
   2099                                                    (void *)pv_api_op);
   2100             break;
   2101 
   2102         case IVD_CMD_CTL_RESET:
   2103             u4_error_code = impeg2d_api_reset(ps_dechdl, (void *)pv_api_ip,
   2104                                               (void *)pv_api_op);
   2105             break;
   2106 
   2107         case IVD_CMD_CTL_SETDEFAULT:
   2108             u4_error_code = impeg2d_api_set_default(ps_dechdl,
   2109                                                           (void *)pv_api_ip,
   2110                                                           (void *)pv_api_op);
   2111             break;
   2112 
   2113         case IVD_CMD_CTL_FLUSH:
   2114             u4_error_code = impeg2d_api_set_flush_mode(ps_dechdl,
   2115                                                              (void *)pv_api_ip,
   2116                                                              (void *)pv_api_op);
   2117             break;
   2118 
   2119         case IVD_CMD_CTL_GETBUFINFO:
   2120             u4_error_code = impeg2d_api_get_buf_info(ps_dechdl,
   2121                                                            (void *)pv_api_ip,
   2122                                                            (void *)pv_api_op);
   2123             break;
   2124 
   2125         case IVD_CMD_CTL_GETVERSION:
   2126             u4_error_code = impeg2d_api_get_version(ps_dechdl, (void *)pv_api_ip,
   2127                                                       (void *)pv_api_op);
   2128             break;
   2129 
   2130         case IMPEG2D_CMD_CTL_SET_NUM_CORES:
   2131             u4_error_code = impeg2d_api_set_num_cores(ps_dechdl,
   2132                                                          (void *)pv_api_ip,
   2133                                                          (void *)pv_api_op);
   2134             break;
   2135 
   2136         case IMPEG2D_CMD_CTL_GET_BUFFER_DIMENSIONS:
   2137             u4_error_code = impeg2d_get_frame_dimensions(ps_dechdl,
   2138                                                        (void *)pv_api_ip,
   2139                                                        (void *)pv_api_op);
   2140             break;
   2141 
   2142         case IMPEG2D_CMD_CTL_GET_SEQ_INFO:
   2143             u4_error_code = impeg2d_api_get_seq_info(ps_dechdl,
   2144                                                          (void *)pv_api_ip,
   2145                                                          (void *)pv_api_op);
   2146             break;
   2147 
   2148         case IMPEG2D_CMD_CTL_SET_PROCESSOR:
   2149             u4_error_code = impeg2d_set_processor(ps_dechdl, (void *)pv_api_ip,
   2150                                                 (void *)pv_api_op);
   2151             break;
   2152 
   2153         default:
   2154             u4_error_code = IV_FAIL;
   2155             break;
   2156     }
   2157 
   2158     return (u4_error_code);
   2159 
   2160 }
   2161 
   2162 /*****************************************************************************/
   2163 /*                                                                           */
   2164 /*  Function Name : impeg2d_api_check_struct_sanity                          */
   2165 /*                                                                           */
   2166 /*  Description   :                                                          */
   2167 /*                                                                           */
   2168 /*  Inputs        :                                                          */
   2169 /*  Globals       : <Does it use any global variables?>                      */
   2170 /*  Outputs       :                                                          */
   2171 /*  Returns       : void                                                     */
   2172 /*                                                                           */
   2173 /*  Issues        : none                                                     */
   2174 /*                                                                           */
   2175 /*  Revision History:                                                        */
   2176 /*                                                                           */
   2177 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   2178 /*         22 10 2008    100356         Draft                                */
   2179 /*                                                                           */
   2180 /*****************************************************************************/
   2181 IV_API_CALL_STATUS_T impeg2d_api_check_struct_sanity(iv_obj_t *ps_handle,
   2182                                                     void *pv_api_ip,
   2183                                                     void *pv_api_op)
   2184 {
   2185     WORD32  i4_cmd;
   2186     UWORD32 *pu4_api_ip;
   2187     UWORD32 *pu4_api_op;
   2188     WORD32 i,j;
   2189 
   2190     if(NULL == pv_api_op)
   2191         return(IV_FAIL);
   2192 
   2193     if(NULL == pv_api_ip)
   2194         return(IV_FAIL);
   2195 
   2196     pu4_api_ip  = (UWORD32 *)pv_api_ip;
   2197     pu4_api_op  = (UWORD32 *)pv_api_op;
   2198     i4_cmd = (IVD_API_COMMAND_TYPE_T)*(pu4_api_ip + 1);
   2199 
   2200     /* error checks on handle */
   2201     switch(i4_cmd)
   2202     {
   2203         case IV_CMD_GET_NUM_MEM_REC:
   2204         case IV_CMD_FILL_NUM_MEM_REC:
   2205             break;
   2206         case IV_CMD_INIT:
   2207             if(ps_handle == NULL)
   2208             {
   2209                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
   2210                 *(pu4_api_op + 1) |= IVD_HANDLE_NULL;
   2211                 return IV_FAIL;
   2212             }
   2213 
   2214             if(ps_handle->u4_size != sizeof(iv_obj_t))
   2215             {
   2216                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
   2217                 *(pu4_api_op + 1) |= IVD_HANDLE_STRUCT_SIZE_INCORRECT;
   2218                 return IV_FAIL;
   2219             }
   2220             break;
   2221         case IVD_CMD_GET_DISPLAY_FRAME:
   2222         case IVD_CMD_VIDEO_DECODE:
   2223         case IV_CMD_RETRIEVE_MEMREC:
   2224         case IVD_CMD_SET_DISPLAY_FRAME:
   2225         case IVD_CMD_REL_DISPLAY_FRAME:
   2226         case IVD_CMD_VIDEO_CTL:
   2227             {
   2228             if(ps_handle == NULL)
   2229             {
   2230                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
   2231                 *(pu4_api_op + 1) |= IVD_HANDLE_NULL;
   2232                 return IV_FAIL;
   2233             }
   2234 
   2235             if(ps_handle->u4_size != sizeof(iv_obj_t))
   2236             {
   2237                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
   2238                 *(pu4_api_op + 1) |= IVD_HANDLE_STRUCT_SIZE_INCORRECT;
   2239                 return IV_FAIL;
   2240             }
   2241             if(ps_handle->pv_fxns != impeg2d_api_function)
   2242             {
   2243                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
   2244                     *(pu4_api_op + 1) |= IVD_INVALID_HANDLE_NULL;
   2245                 return IV_FAIL;
   2246             }
   2247 
   2248             if(ps_handle->pv_codec_handle == NULL)
   2249             {
   2250                 *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
   2251                     *(pu4_api_op + 1) |= IVD_INVALID_HANDLE_NULL;
   2252                 return IV_FAIL;
   2253             }
   2254             }
   2255             break;
   2256         default:
   2257             *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
   2258             *(pu4_api_op + 1) |= IVD_INVALID_API_CMD;
   2259             return IV_FAIL;
   2260     }
   2261 
   2262     switch(i4_cmd)
   2263     {
   2264         case IV_CMD_GET_NUM_MEM_REC:
   2265             {
   2266                 impeg2d_num_mem_rec_ip_t *ps_ip = (impeg2d_num_mem_rec_ip_t *)pv_api_ip;
   2267                 impeg2d_num_mem_rec_op_t *ps_op = (impeg2d_num_mem_rec_op_t *)pv_api_op;
   2268                 ps_op->s_ivd_num_mem_rec_op_t.u4_error_code = 0;
   2269 
   2270                 if(ps_ip->s_ivd_num_mem_rec_ip_t.u4_size != sizeof(impeg2d_num_mem_rec_ip_t))
   2271                 {
   2272                     ps_op->s_ivd_num_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2273                     ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2274                     return(IV_FAIL);
   2275                 }
   2276 
   2277                 if(ps_op->s_ivd_num_mem_rec_op_t.u4_size != sizeof(impeg2d_num_mem_rec_op_t))
   2278                 {
   2279                     ps_op->s_ivd_num_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2280                     ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2281                     return(IV_FAIL);
   2282                 }
   2283             }
   2284             break;
   2285         case IV_CMD_FILL_NUM_MEM_REC:
   2286             {
   2287                 impeg2d_fill_mem_rec_ip_t *ps_ip = (impeg2d_fill_mem_rec_ip_t *)pv_api_ip;
   2288                 impeg2d_fill_mem_rec_op_t *ps_op = (impeg2d_fill_mem_rec_op_t *)pv_api_op;
   2289                 iv_mem_rec_t                  *ps_mem_rec;
   2290 
   2291                 ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code = 0;
   2292 
   2293                 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size != sizeof(impeg2d_fill_mem_rec_ip_t))
   2294                 {
   2295                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2296                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2297                     return(IV_FAIL);
   2298                 }
   2299 
   2300                 if(ps_op->s_ivd_fill_mem_rec_op_t.u4_size != sizeof(impeg2d_fill_mem_rec_op_t))
   2301                 {
   2302                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2303                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2304                     return(IV_FAIL);
   2305                 }
   2306 
   2307                 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd < MIN_WIDTH)
   2308                 {
   2309                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2310                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_REQUESTED_WIDTH_NOT_SUPPPORTED;
   2311                     return(IV_FAIL);
   2312                 }
   2313 
   2314                 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd > MAX_WIDTH)
   2315                 {
   2316                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2317                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_REQUESTED_WIDTH_NOT_SUPPPORTED;
   2318                     return(IV_FAIL);
   2319                 }
   2320 
   2321                 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht < MIN_HEIGHT)
   2322                 {
   2323                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2324                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_REQUESTED_HEIGHT_NOT_SUPPPORTED;
   2325                     return(IV_FAIL);
   2326                 }
   2327 
   2328                 if(ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht > MAX_HEIGHT)
   2329                 {
   2330                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2331                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_REQUESTED_HEIGHT_NOT_SUPPPORTED;
   2332                     return(IV_FAIL);
   2333                 }
   2334 
   2335                 if(NULL == ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location)
   2336                 {
   2337                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2338                     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_NUM_REC_NOT_SUFFICIENT;
   2339                     return(IV_FAIL);
   2340                 }
   2341 
   2342                 /* check memrecords sizes are correct */
   2343                 ps_mem_rec  = ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location;
   2344                 for(i=0;i<NUM_MEM_RECORDS;i++)
   2345                 {
   2346                     if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
   2347                     {
   2348                         ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2349                         ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
   2350                         return IV_FAIL;
   2351                     }
   2352                 }
   2353             }
   2354             break;
   2355 
   2356         case IV_CMD_INIT:
   2357             {
   2358                 impeg2d_init_ip_t *ps_ip = (impeg2d_init_ip_t *)pv_api_ip;
   2359                 impeg2d_init_op_t *ps_op = (impeg2d_init_op_t *)pv_api_op;
   2360                 iv_mem_rec_t          *ps_mem_rec;
   2361                 UWORD32 u4_tot_num_mem_recs;
   2362 
   2363                 ps_op->s_ivd_init_op_t.u4_error_code = 0;
   2364 
   2365                 if(ps_ip->s_ivd_init_ip_t.u4_size != sizeof(impeg2d_init_ip_t))
   2366                 {
   2367                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2368                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2369                     return(IV_FAIL);
   2370                 }
   2371 
   2372                 if(ps_op->s_ivd_init_op_t.u4_size != sizeof(impeg2d_init_op_t))
   2373                 {
   2374                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2375                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2376                     return(IV_FAIL);
   2377                 }
   2378 
   2379                 u4_tot_num_mem_recs = NUM_MEM_RECORDS;
   2380 
   2381 
   2382 
   2383 
   2384                 if(ps_ip->s_ivd_init_ip_t.u4_num_mem_rec > u4_tot_num_mem_recs)
   2385                 {
   2386                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2387                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_NOT_SUFFICIENT;
   2388                     return(IV_FAIL);
   2389                 }
   2390 
   2391                 if(ps_ip->s_ivd_init_ip_t.u4_frm_max_wd < MIN_WIDTH)
   2392                 {
   2393                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2394                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_WIDTH_NOT_SUPPPORTED;
   2395                     return(IV_FAIL);
   2396                 }
   2397 
   2398                 if(ps_ip->s_ivd_init_ip_t.u4_frm_max_wd > MAX_WIDTH)
   2399                 {
   2400                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2401                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_WIDTH_NOT_SUPPPORTED;
   2402                     return(IV_FAIL);
   2403                 }
   2404 
   2405                 if(ps_ip->s_ivd_init_ip_t.u4_frm_max_ht < MIN_HEIGHT)
   2406                 {
   2407                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2408                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_HEIGHT_NOT_SUPPPORTED;
   2409                     return(IV_FAIL);
   2410                 }
   2411 
   2412                 if(ps_ip->s_ivd_init_ip_t.u4_frm_max_ht > MAX_HEIGHT)
   2413                 {
   2414                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2415                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_HEIGHT_NOT_SUPPPORTED;
   2416                     return(IV_FAIL);
   2417                 }
   2418 
   2419                 if(NULL == ps_ip->s_ivd_init_ip_t.pv_mem_rec_location)
   2420                 {
   2421                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2422                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_NUM_REC_NOT_SUFFICIENT;
   2423                     return(IV_FAIL);
   2424                 }
   2425 
   2426                 if((ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420P) &&
   2427                     (ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_422ILE)&&(ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420SP_UV)&&(ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420SP_VU))
   2428                 {
   2429                     ps_op->s_ivd_init_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2430                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED;
   2431                     return(IV_FAIL);
   2432                 }
   2433 
   2434                 /* verify number of mem records */
   2435                 if(ps_ip->s_ivd_init_ip_t.u4_num_mem_rec < NUM_MEM_RECORDS)
   2436                 {
   2437                     ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2438                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_NOT_SUFFICIENT;
   2439                     return IV_FAIL;
   2440                 }
   2441 
   2442                 ps_mem_rec  = ps_ip->s_ivd_init_ip_t.pv_mem_rec_location;
   2443                 /* verify wether first memrecord is handle or not */
   2444                 /*
   2445                 if(ps_mem_rec->pv_base != ps_handle)
   2446                 {
   2447                      // indicate the incorrect handle error
   2448                     ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2449                     ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INVALID_HANDLE;
   2450                     return IV_FAIL;
   2451                 }
   2452 */
   2453                 /* check memrecords sizes are correct */
   2454                 for(i=0;i < (WORD32)ps_ip->s_ivd_init_ip_t.u4_num_mem_rec ; i++)
   2455                 {
   2456                     if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
   2457                     {
   2458                         ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2459                         ps_op->s_ivd_init_op_t.u4_error_code |= IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
   2460                         return IV_FAIL;
   2461                     }
   2462                 }
   2463 
   2464                 /* verify memtabs for overlapping regions */
   2465                 {
   2466                     UWORD8 *pau1_start[NUM_MEM_RECORDS];
   2467                     UWORD8 *pau1_end[NUM_MEM_RECORDS];
   2468 
   2469 
   2470                     pau1_start[0] = (UWORD8 *)(ps_mem_rec[0].pv_base);
   2471                     pau1_end[0]   = (UWORD8 *)(ps_mem_rec[0].pv_base) + ps_mem_rec[0].u4_mem_size - 1;
   2472                     for(i = 1; i < (WORD32)ps_ip->s_ivd_init_ip_t.u4_num_mem_rec; i++)
   2473                     {
   2474                         /* This array is populated to check memtab overlapp */
   2475                         pau1_start[i] = (UWORD8 *)(ps_mem_rec[i].pv_base);
   2476                         pau1_end[i]   = (UWORD8 *)(ps_mem_rec[i].pv_base) + ps_mem_rec[i].u4_mem_size - 1;
   2477 
   2478                         for(j = 0; j < i; j++)
   2479                         {
   2480                             if((pau1_start[i] >= pau1_start[j]) && (pau1_start[i] <= pau1_end[j]))
   2481                             {
   2482                                 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2483                                 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
   2484                                 return IV_FAIL;
   2485                             }
   2486 
   2487                             if((pau1_end[i] >= pau1_start[j]) && (pau1_end[i] <= pau1_end[j]))
   2488                             {
   2489                                 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2490                                 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
   2491                                 return IV_FAIL;
   2492                             }
   2493 
   2494                             if((pau1_start[i] < pau1_start[j]) && (pau1_end[i] > pau1_end[j]))
   2495                             {
   2496                                 ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2497                                 ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
   2498                                 return IV_FAIL;
   2499                             }
   2500                         }
   2501                     }
   2502                 }
   2503 
   2504 
   2505 
   2506 
   2507                 {
   2508                     iv_mem_rec_t    as_mem_rec_ittiam_api[NUM_MEM_RECORDS];
   2509 
   2510                     impeg2d_fill_mem_rec_ip_t s_fill_mem_rec_ip;
   2511                     impeg2d_fill_mem_rec_op_t s_fill_mem_rec_op;
   2512                     IV_API_CALL_STATUS_T e_status;
   2513                     WORD32 i4_num_memrec;
   2514                     {
   2515 
   2516                         iv_num_mem_rec_ip_t s_no_of_mem_rec_query_ip;
   2517                         iv_num_mem_rec_op_t s_no_of_mem_rec_query_op;
   2518 
   2519 
   2520                         s_no_of_mem_rec_query_ip.u4_size = sizeof(iv_num_mem_rec_ip_t);
   2521                         s_no_of_mem_rec_query_op.u4_size = sizeof(iv_num_mem_rec_op_t);
   2522 
   2523                         s_no_of_mem_rec_query_ip.e_cmd   = IV_CMD_GET_NUM_MEM_REC;
   2524                         impeg2d_api_function(NULL,
   2525                                                     (void *)&s_no_of_mem_rec_query_ip,
   2526                                                     (void *)&s_no_of_mem_rec_query_op);
   2527 
   2528                         i4_num_memrec  = s_no_of_mem_rec_query_op.u4_num_mem_rec;
   2529 
   2530 
   2531 
   2532                     }
   2533 
   2534 
   2535                     /* initialize mem records array with sizes */
   2536                     for(i = 0; i < i4_num_memrec; i++)
   2537                     {
   2538                         as_mem_rec_ittiam_api[i].u4_size = sizeof(iv_mem_rec_t);
   2539                     }
   2540 
   2541                     s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_size                   = sizeof(impeg2d_fill_mem_rec_ip_t);
   2542                     s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.e_cmd                     = IV_CMD_FILL_NUM_MEM_REC;
   2543                     s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd             = ps_ip->s_ivd_init_ip_t.u4_frm_max_wd;
   2544                     s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht             = ps_ip->s_ivd_init_ip_t.u4_frm_max_ht;
   2545                     s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location       = as_mem_rec_ittiam_api;
   2546                     s_fill_mem_rec_ip.u4_share_disp_buf                                 = ps_ip->u4_share_disp_buf;
   2547                     s_fill_mem_rec_ip.e_output_format                                   = ps_ip->s_ivd_init_ip_t.e_output_format;
   2548                     s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_size                   = sizeof(impeg2d_fill_mem_rec_op_t);
   2549 
   2550 
   2551                     e_status = impeg2d_api_function(NULL,
   2552                                                 (void *)&s_fill_mem_rec_ip,
   2553                                                 (void *)&s_fill_mem_rec_op);
   2554                     if(IV_FAIL == e_status)
   2555                     {
   2556                         ps_op->s_ivd_init_op_t.u4_error_code = s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_error_code;
   2557                         return(IV_FAIL);
   2558                     }
   2559 
   2560 
   2561 
   2562                     for(i = 0; i < i4_num_memrec; i ++)
   2563                     {
   2564                         if(ps_mem_rec[i].pv_base == NULL)
   2565                         {
   2566                             ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2567                             ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_BASE_NULL;
   2568                             return IV_FAIL;
   2569                         }
   2570 #ifdef CHECK_ALIGN
   2571 
   2572                         if((UWORD32)(ps_mem_rec[i].pv_base) & (ps_mem_rec[i].u4_mem_alignment - 1))
   2573                         {
   2574                             ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2575                             ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_ALIGNMENT_ERR;
   2576                             return IV_FAIL;
   2577                         }
   2578 #endif //CHECK_ALIGN
   2579                         if(ps_mem_rec[i].u4_mem_alignment != as_mem_rec_ittiam_api[i].u4_mem_alignment)
   2580                         {
   2581                             ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2582                             ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_ALIGNMENT_ERR;
   2583                             return IV_FAIL;
   2584                         }
   2585 
   2586                         if(ps_mem_rec[i].u4_mem_size < as_mem_rec_ittiam_api[i].u4_mem_size)
   2587                         {
   2588                             ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2589                             ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_INSUFFICIENT_SIZE;
   2590                             return IV_FAIL;
   2591                         }
   2592 
   2593                         if(ps_mem_rec[i].e_mem_type != as_mem_rec_ittiam_api[i].e_mem_type)
   2594                         {
   2595                             if (IV_EXTERNAL_CACHEABLE_SCRATCH_MEM == as_mem_rec_ittiam_api[i].e_mem_type)
   2596                             {
   2597                                 if (IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM == ps_mem_rec[i].e_mem_type)
   2598                                 {
   2599                                     continue;
   2600                                 }
   2601                             }
   2602                             ps_op->s_ivd_init_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2603                             ps_op->s_ivd_init_op_t.u4_error_code |= IVD_INIT_DEC_MEM_REC_INCORRECT_TYPE;
   2604                             return IV_FAIL;
   2605                         }
   2606                     }
   2607                 }
   2608 
   2609 
   2610             }
   2611             break;
   2612 
   2613         case IVD_CMD_GET_DISPLAY_FRAME:
   2614             {
   2615                 impeg2d_get_display_frame_ip_t *ps_ip = (impeg2d_get_display_frame_ip_t *)pv_api_ip;
   2616                 impeg2d_get_display_frame_op_t *ps_op = (impeg2d_get_display_frame_op_t *)pv_api_op;
   2617 
   2618                 ps_op->s_ivd_get_display_frame_op_t.u4_error_code = 0;
   2619 
   2620                 if(ps_ip->s_ivd_get_display_frame_ip_t.u4_size != sizeof(impeg2d_get_display_frame_ip_t))
   2621                 {
   2622                     ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2623                     ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2624                     return(IV_FAIL);
   2625                 }
   2626 
   2627                 if(ps_op->s_ivd_get_display_frame_op_t.u4_size != sizeof(impeg2d_get_display_frame_op_t))
   2628                 {
   2629                     ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2630                     ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2631                     return(IV_FAIL);
   2632                 }
   2633 
   2634                 if(ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.u4_num_bufs == 0)
   2635                 {
   2636                     ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2637                     ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS;
   2638                     return IV_FAIL;
   2639                 }
   2640 
   2641                 for(i = 0; i< (WORD32)ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.u4_num_bufs;i++)
   2642                 {
   2643                     if(ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.pu1_bufs[i] == NULL)
   2644                     {
   2645                         ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2646                         ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_OP_BUF_NULL;
   2647                         return IV_FAIL;
   2648                     }
   2649 
   2650                     if(ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.u4_min_out_buf_size[i] == 0)
   2651                     {
   2652                         ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2653                         ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
   2654                         return IV_FAIL;
   2655                     }
   2656                     /*
   2657                     if(ps_ip->s_ivd_get_display_frame_ip_t.s_out_buffer.u4_min_out_buf_size[i] == 0)
   2658                     {
   2659                         ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2660                         ps_op->s_ivd_get_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
   2661                         return IV_FAIL;
   2662                     }
   2663                     */
   2664                 }
   2665             }
   2666             break;
   2667        case IVD_CMD_REL_DISPLAY_FRAME:
   2668             {
   2669                 impeg2d_rel_display_frame_ip_t *ps_ip = (impeg2d_rel_display_frame_ip_t *)pv_api_ip;
   2670                 impeg2d_rel_display_frame_op_t *ps_op = (impeg2d_rel_display_frame_op_t *)pv_api_op;
   2671 
   2672                 ps_op->s_ivd_rel_display_frame_op_t.u4_error_code = 0;
   2673 
   2674                 if ((ps_ip->s_ivd_rel_display_frame_ip_t.u4_size != sizeof(impeg2d_rel_display_frame_ip_t))
   2675                         && (ps_ip->s_ivd_rel_display_frame_ip_t.u4_size != sizeof(ivd_rel_display_frame_ip_t)))
   2676                 {
   2677                     ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2678                     ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2679                     return(IV_FAIL);
   2680                 }
   2681 
   2682                 if((ps_op->s_ivd_rel_display_frame_op_t.u4_size != sizeof(impeg2d_rel_display_frame_op_t)) &&
   2683                         (ps_op->s_ivd_rel_display_frame_op_t.u4_size != sizeof(ivd_rel_display_frame_op_t)))
   2684                 {
   2685                     ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2686                     ps_op->s_ivd_rel_display_frame_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2687                     return(IV_FAIL);
   2688                 }
   2689 
   2690             }
   2691             break;
   2692 
   2693 
   2694         case IVD_CMD_SET_DISPLAY_FRAME:
   2695             {
   2696                 impeg2d_set_display_frame_ip_t *ps_ip = (impeg2d_set_display_frame_ip_t *)pv_api_ip;
   2697                 impeg2d_set_display_frame_op_t *ps_op = (impeg2d_set_display_frame_op_t *)pv_api_op;
   2698                 UWORD32 j, i;
   2699 
   2700                 ps_op->s_ivd_set_display_frame_op_t.u4_error_code = 0;
   2701 
   2702                 if ((ps_ip->s_ivd_set_display_frame_ip_t.u4_size != sizeof(impeg2d_set_display_frame_ip_t))
   2703                         && (ps_ip->s_ivd_set_display_frame_ip_t.u4_size != sizeof(ivd_set_display_frame_ip_t)))
   2704                 {
   2705                     ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2706                     ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2707                     return(IV_FAIL);
   2708                 }
   2709 
   2710                 if((ps_op->s_ivd_set_display_frame_op_t.u4_size != sizeof(impeg2d_set_display_frame_op_t)) &&
   2711                         (ps_op->s_ivd_set_display_frame_op_t.u4_size != sizeof(ivd_set_display_frame_op_t)))
   2712                 {
   2713                     ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2714                     ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2715                     return(IV_FAIL);
   2716                 }
   2717 
   2718                 if(ps_ip->s_ivd_set_display_frame_ip_t.num_disp_bufs == 0)
   2719                 {
   2720                     ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2721                     ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS;
   2722                     return IV_FAIL;
   2723                 }
   2724 
   2725                 for(j = 0; j < ps_ip->s_ivd_set_display_frame_ip_t.num_disp_bufs; j++)
   2726                 {
   2727                     if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_num_bufs == 0)
   2728                     {
   2729                         ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2730                         ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUFS;
   2731                         return IV_FAIL;
   2732                     }
   2733 
   2734                     for(i=0;i< ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_num_bufs;i++)
   2735                     {
   2736                         if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].pu1_bufs[i] == NULL)
   2737                         {
   2738                             ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2739                             ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_OP_BUF_NULL;
   2740                             return IV_FAIL;
   2741                         }
   2742 
   2743                         if(ps_ip->s_ivd_set_display_frame_ip_t.s_disp_buffer[j].u4_min_out_buf_size[i] == 0)
   2744                         {
   2745                             ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2746                             ps_op->s_ivd_set_display_frame_op_t.u4_error_code |= IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
   2747                             return IV_FAIL;
   2748                         }
   2749                     }
   2750                 }
   2751             }
   2752             break;
   2753 
   2754         case IVD_CMD_VIDEO_DECODE:
   2755             {
   2756                 impeg2d_video_decode_ip_t *ps_ip = (impeg2d_video_decode_ip_t *)pv_api_ip;
   2757                 impeg2d_video_decode_op_t *ps_op = (impeg2d_video_decode_op_t *)pv_api_op;
   2758 
   2759                 ps_op->s_ivd_video_decode_op_t.u4_error_code = 0;
   2760 
   2761                 if(ps_ip->s_ivd_video_decode_ip_t.u4_size != sizeof(impeg2d_video_decode_ip_t))
   2762                 {
   2763                     ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2764                     ps_op->s_ivd_video_decode_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2765                     return(IV_FAIL);
   2766                 }
   2767 
   2768                 if(ps_op->s_ivd_video_decode_op_t.u4_size != sizeof(impeg2d_video_decode_op_t))
   2769                 {
   2770                     ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2771                     ps_op->s_ivd_video_decode_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2772                     return(IV_FAIL);
   2773                 }
   2774 
   2775             }
   2776             break;
   2777 
   2778         case IV_CMD_RETRIEVE_MEMREC:
   2779             {
   2780                 impeg2d_retrieve_mem_rec_ip_t *ps_ip = (impeg2d_retrieve_mem_rec_ip_t *)pv_api_ip;
   2781                 impeg2d_retrieve_mem_rec_op_t *ps_op = (impeg2d_retrieve_mem_rec_op_t *)pv_api_op;
   2782                 iv_mem_rec_t          *ps_mem_rec;
   2783 
   2784                 ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code = 0;
   2785 
   2786                 if(ps_ip->s_ivd_retrieve_mem_rec_ip_t.u4_size != sizeof(impeg2d_retrieve_mem_rec_ip_t))
   2787                 {
   2788                     ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2789                     ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2790                     return(IV_FAIL);
   2791                 }
   2792 
   2793                 if(ps_op->s_ivd_retrieve_mem_rec_op_t.u4_size != sizeof(impeg2d_retrieve_mem_rec_op_t))
   2794                 {
   2795                     ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2796                     ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2797                     return(IV_FAIL);
   2798                 }
   2799 
   2800                 ps_mem_rec  = ps_ip->s_ivd_retrieve_mem_rec_ip_t.pv_mem_rec_location;
   2801                 /* check memrecords sizes are correct */
   2802                 for(i=0;i < NUM_MEM_RECORDS ; i++)
   2803                 {
   2804                     if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
   2805                     {
   2806                         ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2807                         ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
   2808                         return IV_FAIL;
   2809                     }
   2810                 }
   2811             }
   2812             break;
   2813 
   2814         case IVD_CMD_VIDEO_CTL:
   2815             {
   2816                 UWORD32 *pu4_ptr_cmd;
   2817                 UWORD32 u4_sub_command;
   2818 
   2819                 pu4_ptr_cmd = (UWORD32 *)pv_api_ip;
   2820                 pu4_ptr_cmd += 2;
   2821                 u4_sub_command = *pu4_ptr_cmd;
   2822 
   2823                 switch(u4_sub_command)
   2824                 {
   2825                     case IVD_CMD_CTL_SETPARAMS:
   2826                         {
   2827                             impeg2d_ctl_set_config_ip_t *ps_ip;
   2828                             impeg2d_ctl_set_config_op_t *ps_op;
   2829                             ps_ip = (impeg2d_ctl_set_config_ip_t *)pv_api_ip;
   2830                             ps_op = (impeg2d_ctl_set_config_op_t *)pv_api_op;
   2831 
   2832                             ps_op->s_ivd_ctl_set_config_op_t.u4_error_code = 0;
   2833 
   2834                             if(ps_ip->s_ivd_ctl_set_config_ip_t.u4_size != sizeof(impeg2d_ctl_set_config_ip_t))
   2835                             {
   2836                                 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2837                                 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2838                                 return IV_FAIL;
   2839                             }
   2840                         }
   2841                     case IVD_CMD_CTL_SETDEFAULT:
   2842                         {
   2843                             impeg2d_ctl_set_config_op_t *ps_op;
   2844                             ps_op = (impeg2d_ctl_set_config_op_t *)pv_api_op;
   2845                             ps_op->s_ivd_ctl_set_config_op_t.u4_error_code   = 0;
   2846 
   2847                             if(ps_op->s_ivd_ctl_set_config_op_t.u4_size != sizeof(impeg2d_ctl_set_config_op_t))
   2848                             {
   2849                                 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2850                                 ps_op->s_ivd_ctl_set_config_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2851                                 return IV_FAIL;
   2852                             }
   2853                         }
   2854                         break;
   2855 
   2856                     case IVD_CMD_CTL_GETPARAMS:
   2857                         {
   2858                             impeg2d_ctl_getstatus_ip_t *ps_ip;
   2859                             impeg2d_ctl_getstatus_op_t *ps_op;
   2860 
   2861                             ps_ip = (impeg2d_ctl_getstatus_ip_t *)pv_api_ip;
   2862                             ps_op = (impeg2d_ctl_getstatus_op_t *)pv_api_op;
   2863 
   2864                             ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code   = 0;
   2865 
   2866                             if(ps_ip->s_ivd_ctl_getstatus_ip_t.u4_size != sizeof(impeg2d_ctl_getstatus_ip_t))
   2867                             {
   2868                                 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2869                                 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2870                                 return IV_FAIL;
   2871                             }
   2872                             if(ps_op->s_ivd_ctl_getstatus_op_t.u4_size != sizeof(impeg2d_ctl_getstatus_op_t))
   2873                             {
   2874                                 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2875                                 ps_op->s_ivd_ctl_getstatus_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2876                                 return IV_FAIL;
   2877                             }
   2878                         }
   2879                         break;
   2880 
   2881                     case IVD_CMD_CTL_GETBUFINFO:
   2882                         {
   2883                             impeg2d_ctl_getbufinfo_ip_t *ps_ip;
   2884                             impeg2d_ctl_getbufinfo_op_t *ps_op;
   2885                             ps_ip = (impeg2d_ctl_getbufinfo_ip_t *)pv_api_ip;
   2886                             ps_op = (impeg2d_ctl_getbufinfo_op_t *)pv_api_op;
   2887 
   2888                             ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code  = 0;
   2889 
   2890                             if(ps_ip->s_ivd_ctl_getbufinfo_ip_t.u4_size != sizeof(impeg2d_ctl_getbufinfo_ip_t))
   2891                             {
   2892                                 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2893                                 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2894                                 return IV_FAIL;
   2895                             }
   2896                             if(ps_op->s_ivd_ctl_getbufinfo_op_t.u4_size != sizeof(impeg2d_ctl_getbufinfo_op_t))
   2897                             {
   2898                                 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2899                                 ps_op->s_ivd_ctl_getbufinfo_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2900                                 return IV_FAIL;
   2901                             }
   2902                         }
   2903                         break;
   2904 
   2905                     case IVD_CMD_CTL_GETVERSION:
   2906                         {
   2907                             impeg2d_ctl_getversioninfo_ip_t *ps_ip;
   2908                             impeg2d_ctl_getversioninfo_op_t *ps_op;
   2909                             ps_ip = (impeg2d_ctl_getversioninfo_ip_t *)pv_api_ip;
   2910                             ps_op = (impeg2d_ctl_getversioninfo_op_t *)pv_api_op;
   2911 
   2912                             ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code  = 0;
   2913 
   2914                             if(ps_ip->s_ivd_ctl_getversioninfo_ip_t.u4_size != sizeof(impeg2d_ctl_getversioninfo_ip_t))
   2915                             {
   2916                                 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2917                                 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2918                                 return IV_FAIL;
   2919                             }
   2920                             if(ps_op->s_ivd_ctl_getversioninfo_op_t.u4_size != sizeof(impeg2d_ctl_getversioninfo_op_t))
   2921                             {
   2922                                 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2923                                 ps_op->s_ivd_ctl_getversioninfo_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2924                                 return IV_FAIL;
   2925                             }
   2926                         }
   2927                         break;
   2928 
   2929                     case IVD_CMD_CTL_FLUSH:
   2930                         {
   2931                             impeg2d_ctl_flush_ip_t *ps_ip;
   2932                             impeg2d_ctl_flush_op_t *ps_op;
   2933                             ps_ip = (impeg2d_ctl_flush_ip_t *)pv_api_ip;
   2934                             ps_op = (impeg2d_ctl_flush_op_t *)pv_api_op;
   2935 
   2936                             ps_op->s_ivd_ctl_flush_op_t.u4_error_code = 0;
   2937 
   2938                             if(ps_ip->s_ivd_ctl_flush_ip_t.u4_size != sizeof(impeg2d_ctl_flush_ip_t))
   2939                             {
   2940                                 ps_op->s_ivd_ctl_flush_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2941                                 ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2942                                 return IV_FAIL;
   2943                             }
   2944                             if(ps_op->s_ivd_ctl_flush_op_t.u4_size != sizeof(impeg2d_ctl_flush_op_t))
   2945                             {
   2946                                 ps_op->s_ivd_ctl_flush_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2947                                 ps_op->s_ivd_ctl_flush_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2948                                 return IV_FAIL;
   2949                             }
   2950                         }
   2951                         break;
   2952 
   2953                     case IVD_CMD_CTL_RESET:
   2954                         {
   2955                             impeg2d_ctl_reset_ip_t *ps_ip;
   2956                             impeg2d_ctl_reset_op_t *ps_op;
   2957                             ps_ip = (impeg2d_ctl_reset_ip_t *)pv_api_ip;
   2958                             ps_op = (impeg2d_ctl_reset_op_t *)pv_api_op;
   2959 
   2960                             ps_op->s_ivd_ctl_reset_op_t.u4_error_code    = 0;
   2961 
   2962                             if(ps_ip->s_ivd_ctl_reset_ip_t.u4_size != sizeof(impeg2d_ctl_reset_ip_t))
   2963                             {
   2964                                 ps_op->s_ivd_ctl_reset_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2965                                 ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2966                                 return IV_FAIL;
   2967                             }
   2968                             if(ps_op->s_ivd_ctl_reset_op_t.u4_size != sizeof(impeg2d_ctl_reset_op_t))
   2969                             {
   2970                                 ps_op->s_ivd_ctl_reset_op_t.u4_error_code  |= 1 << IVD_UNSUPPORTEDPARAM;
   2971                                 ps_op->s_ivd_ctl_reset_op_t.u4_error_code |= IVD_OP_API_STRUCT_SIZE_INCORRECT;
   2972                                 return IV_FAIL;
   2973                             }
   2974                         }
   2975                         break;
   2976 
   2977                     case IMPEG2D_CMD_CTL_GET_BUFFER_DIMENSIONS:
   2978                     {
   2979                         impeg2d_ctl_get_frame_dimensions_ip_t *ps_ip;
   2980                         impeg2d_ctl_get_frame_dimensions_op_t *ps_op;
   2981 
   2982                         ps_ip =
   2983                                         (impeg2d_ctl_get_frame_dimensions_ip_t *)pv_api_ip;
   2984                         ps_op =
   2985                                         (impeg2d_ctl_get_frame_dimensions_op_t *)pv_api_op;
   2986 
   2987                         if(ps_ip->u4_size
   2988                                         != sizeof(impeg2d_ctl_get_frame_dimensions_ip_t))
   2989                         {
   2990                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   2991                             ps_op->u4_error_code |=
   2992                                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
   2993                             return IV_FAIL;
   2994                         }
   2995 
   2996                         if(ps_op->u4_size
   2997                                         != sizeof(impeg2d_ctl_get_frame_dimensions_op_t))
   2998                         {
   2999                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3000                             ps_op->u4_error_code |=
   3001                                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
   3002                             return IV_FAIL;
   3003                         }
   3004 
   3005                         break;
   3006                     }
   3007                     case IMPEG2D_CMD_CTL_GET_SEQ_INFO:
   3008                     {
   3009                         impeg2d_ctl_get_seq_info_ip_t *ps_ip;
   3010                         impeg2d_ctl_get_seq_info_op_t *ps_op;
   3011 
   3012                         ps_ip =
   3013                                         (impeg2d_ctl_get_seq_info_ip_t *)pv_api_ip;
   3014                         ps_op =
   3015                                         (impeg2d_ctl_get_seq_info_op_t *)pv_api_op;
   3016 
   3017                         if(ps_ip->u4_size
   3018                                         != sizeof(impeg2d_ctl_get_seq_info_ip_t))
   3019                         {
   3020                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3021                             ps_op->u4_error_code |=
   3022                                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
   3023                             return IV_FAIL;
   3024                         }
   3025 
   3026                         if(ps_op->u4_size
   3027                                         != sizeof(impeg2d_ctl_get_seq_info_op_t))
   3028                         {
   3029                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3030                             ps_op->u4_error_code |=
   3031                                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
   3032                             return IV_FAIL;
   3033                         }
   3034 
   3035                         break;
   3036                     }
   3037                     case IMPEG2D_CMD_CTL_SET_NUM_CORES:
   3038                     {
   3039                         impeg2d_ctl_set_num_cores_ip_t *ps_ip;
   3040                         impeg2d_ctl_set_num_cores_op_t *ps_op;
   3041 
   3042                         ps_ip = (impeg2d_ctl_set_num_cores_ip_t *)pv_api_ip;
   3043                         ps_op = (impeg2d_ctl_set_num_cores_op_t *)pv_api_op;
   3044 
   3045                         if(ps_ip->u4_size
   3046                                         != sizeof(impeg2d_ctl_set_num_cores_ip_t))
   3047                         {
   3048                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3049                             ps_op->u4_error_code |=
   3050                                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
   3051                             return IV_FAIL;
   3052                         }
   3053 
   3054                         if(ps_op->u4_size
   3055                                         != sizeof(impeg2d_ctl_set_num_cores_op_t))
   3056                         {
   3057                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3058                             ps_op->u4_error_code |=
   3059                                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
   3060                             return IV_FAIL;
   3061                         }
   3062 
   3063 #ifdef MULTICORE
   3064                         if((ps_ip->u4_num_cores < 1) || (ps_ip->u4_num_cores > MAX_THREADS))
   3065 #else
   3066                         if(ps_ip->u4_num_cores != 1)
   3067 #endif
   3068                         {
   3069                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3070                             return IV_FAIL;
   3071                         }
   3072                         break;
   3073                     }
   3074                     case IMPEG2D_CMD_CTL_SET_PROCESSOR:
   3075                     {
   3076                         impeg2d_ctl_set_processor_ip_t *ps_ip;
   3077                         impeg2d_ctl_set_processor_op_t *ps_op;
   3078 
   3079                         ps_ip = (impeg2d_ctl_set_processor_ip_t *)pv_api_ip;
   3080                         ps_op = (impeg2d_ctl_set_processor_op_t *)pv_api_op;
   3081 
   3082                         if(ps_ip->u4_size
   3083                                         != sizeof(impeg2d_ctl_set_processor_ip_t))
   3084                         {
   3085                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3086                             ps_op->u4_error_code |=
   3087                                             IVD_IP_API_STRUCT_SIZE_INCORRECT;
   3088                             return IV_FAIL;
   3089                         }
   3090 
   3091                         if(ps_op->u4_size
   3092                                         != sizeof(impeg2d_ctl_set_processor_op_t))
   3093                         {
   3094                             ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3095                             ps_op->u4_error_code |=
   3096                                             IVD_OP_API_STRUCT_SIZE_INCORRECT;
   3097                             return IV_FAIL;
   3098                         }
   3099 
   3100                         break;
   3101                     }
   3102                     default:
   3103                         break;
   3104 
   3105                 }
   3106             }
   3107             break;
   3108 
   3109         default:
   3110             {            *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
   3111                          *(pu4_api_op + 1) |= IVD_UNSUPPORTED_API_CMD;
   3112                          return IV_FAIL;
   3113             }
   3114 
   3115 
   3116     }
   3117 
   3118     return IV_SUCCESS;
   3119 }
   3120 
   3121 /*****************************************************************************/
   3122 /*                                                                           */
   3123 /*  Function Name :   impeg2d_api_entity                                     */
   3124 /*                                                                           */
   3125 /*  Description   :                                                          */
   3126 /*                                                                           */
   3127 /*  Inputs        :                                                          */
   3128 /*  Globals       : <Does it use any global variables?>                      */
   3129 /*  Outputs       :                                                          */
   3130 /*  Returns       : void                                                     */
   3131 /*                                                                           */
   3132 /*  Issues        : none                                                     */
   3133 /*                                                                           */
   3134 /*  Revision History:                                                        */
   3135 /*                                                                           */
   3136 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   3137 /*         22 10 2008    100356         Draft                                */
   3138 /*                                                                           */
   3139 /*****************************************************************************/
   3140 
   3141 
   3142 IV_API_CALL_STATUS_T impeg2d_api_entity(iv_obj_t *ps_dechdl,
   3143                                         void *pv_api_ip,
   3144                                         void *pv_api_op)
   3145 {
   3146     iv_obj_t *ps_dec_handle;
   3147     dec_state_t *ps_dec_state;
   3148     dec_state_multi_core_t *ps_dec_state_multi_core;
   3149 
   3150     impeg2d_video_decode_ip_t    *ps_dec_ip;
   3151 
   3152     impeg2d_video_decode_op_t    *ps_dec_op;
   3153     WORD32 bytes_remaining;
   3154     pic_buf_t *ps_disp_pic;
   3155 
   3156 
   3157 
   3158     ps_dec_ip = (impeg2d_video_decode_ip_t    *)pv_api_ip;
   3159     ps_dec_op = (impeg2d_video_decode_op_t    *)pv_api_op;
   3160 
   3161     memset(ps_dec_op,0,sizeof(impeg2d_video_decode_op_t));
   3162 
   3163     ps_dec_op->s_ivd_video_decode_op_t.u4_size = sizeof(impeg2d_video_decode_op_t);
   3164     ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0;
   3165     bytes_remaining = ps_dec_ip->s_ivd_video_decode_ip_t.u4_num_Bytes;
   3166 
   3167     ps_dec_handle = (iv_obj_t *)ps_dechdl;
   3168 
   3169     if(ps_dechdl == NULL)
   3170     {
   3171         return(IV_FAIL);
   3172     }
   3173 
   3174 
   3175 
   3176     ps_dec_state_multi_core  = ps_dec_handle->pv_codec_handle;
   3177     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
   3178 
   3179     ps_dec_state->ps_disp_frm_buf = &(ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf);
   3180     if(0 == ps_dec_state->u4_share_disp_buf)
   3181     {
   3182         ps_dec_state->ps_disp_frm_buf->pv_y_buf  = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[0];
   3183         ps_dec_state->ps_disp_frm_buf->pv_u_buf  = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[1];
   3184         ps_dec_state->ps_disp_frm_buf->pv_v_buf  = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[2];
   3185     }
   3186 
   3187     ps_dec_state->ps_disp_pic = NULL;
   3188     ps_dec_state->i4_frame_decoded = 0;
   3189     /*rest bytes consumed */
   3190     ps_dec_op->s_ivd_video_decode_op_t.u4_num_bytes_consumed = 0;
   3191 
   3192     ps_dec_op->s_ivd_video_decode_op_t.u4_error_code           = IV_SUCCESS;
   3193 
   3194     if((ps_dec_ip->s_ivd_video_decode_ip_t.pv_stream_buffer == NULL)&&(ps_dec_state->u1_flushfrm==0))
   3195     {
   3196         ps_dec_op->s_ivd_video_decode_op_t.u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
   3197         ps_dec_op->s_ivd_video_decode_op_t.u4_error_code |= IVD_DEC_FRM_BS_BUF_NULL;
   3198         return IV_FAIL;
   3199     }
   3200 
   3201 
   3202     if (ps_dec_state->u4_num_frames_decoded > NUM_FRAMES_LIMIT)
   3203     {
   3204         ps_dec_op->s_ivd_video_decode_op_t.u4_error_code       = IMPEG2D_SAMPLE_VERSION_LIMIT_ERR;
   3205         return(IV_FAIL);
   3206     }
   3207 
   3208     if(((0 == ps_dec_state->u2_header_done) || (ps_dec_state->u2_decode_header == 1)) && (ps_dec_state->u1_flushfrm == 0))
   3209     {
   3210         impeg2d_dec_hdr(ps_dec_state,ps_dec_ip ,ps_dec_op);
   3211         bytes_remaining -= ps_dec_op->s_ivd_video_decode_op_t.u4_num_bytes_consumed;
   3212     }
   3213 
   3214     if((1 != ps_dec_state->u2_decode_header) &&
   3215         (((bytes_remaining > 0) && (1 == ps_dec_state->u2_header_done)) || ps_dec_state->u1_flushfrm))
   3216     {
   3217         if(ps_dec_state->u1_flushfrm)
   3218         {
   3219             if(ps_dec_state->aps_ref_pics[1] != NULL)
   3220             {
   3221                 impeg2_disp_mgr_add(&ps_dec_state->s_disp_mgr, ps_dec_state->aps_ref_pics[1], ps_dec_state->aps_ref_pics[1]->i4_buf_id);
   3222                 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[1]->i4_buf_id, BUF_MGR_REF);
   3223                 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF);
   3224 
   3225                 ps_dec_state->aps_ref_pics[1] = NULL;
   3226                 ps_dec_state->aps_ref_pics[0] = NULL;
   3227 
   3228             }
   3229             else if(ps_dec_state->aps_ref_pics[0] != NULL)
   3230             {
   3231                 impeg2_disp_mgr_add(&ps_dec_state->s_disp_mgr, ps_dec_state->aps_ref_pics[0], ps_dec_state->aps_ref_pics[0]->i4_buf_id);
   3232                 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF);
   3233 
   3234                 ps_dec_state->aps_ref_pics[0] = NULL;
   3235             }
   3236             ps_dec_ip->s_ivd_video_decode_ip_t.u4_size                 = sizeof(impeg2d_video_decode_ip_t);
   3237             ps_dec_op->s_ivd_video_decode_op_t.u4_size                 = sizeof(impeg2d_video_decode_op_t);
   3238 
   3239             ps_disp_pic = impeg2_disp_mgr_get(&ps_dec_state->s_disp_mgr, &ps_dec_state->i4_disp_buf_id);
   3240 
   3241             ps_dec_state->ps_disp_pic = ps_disp_pic;
   3242             if(ps_disp_pic == NULL)
   3243             {
   3244                 ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0;
   3245             }
   3246             else
   3247             {
   3248                 WORD32 fmt_conv;
   3249                 if(0 == ps_dec_state->u4_share_disp_buf)
   3250                 {
   3251                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_y_buf  = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[0];
   3252                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_u_buf  = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[1];
   3253                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_v_buf  = ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[2];
   3254                     fmt_conv = 1;
   3255                 }
   3256                 else
   3257                 {
   3258                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_y_buf  = ps_disp_pic->pu1_y;
   3259                     if(IV_YUV_420P == ps_dec_state->i4_chromaFormat)
   3260                     {
   3261                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_u_buf  = ps_disp_pic->pu1_u;
   3262                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_v_buf  = ps_disp_pic->pu1_v;
   3263                         fmt_conv = 0;
   3264                     }
   3265                     else
   3266                     {
   3267                         UWORD8 *pu1_buf;
   3268 
   3269                         pu1_buf = ps_dec_state->as_disp_buffers[ps_disp_pic->i4_buf_id].pu1_bufs[1];
   3270                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_u_buf  = pu1_buf;
   3271 
   3272                         pu1_buf = ps_dec_state->as_disp_buffers[ps_disp_pic->i4_buf_id].pu1_bufs[2];
   3273                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.pv_v_buf  = pu1_buf;
   3274                         fmt_conv = 1;
   3275                     }
   3276                 }
   3277 
   3278                 if(fmt_conv == 1)
   3279                 {
   3280                     iv_yuv_buf_t *ps_dst;
   3281 
   3282 
   3283                     ps_dst = &(ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf);
   3284                     if(ps_dec_state->u4_deinterlace && (0 == ps_dec_state->u2_progressive_frame))
   3285                     {
   3286                         impeg2d_deinterlace(ps_dec_state,
   3287                                             ps_disp_pic,
   3288                                             ps_dst,
   3289                                             0,
   3290                                             ps_dec_state->u2_vertical_size);
   3291 
   3292                     }
   3293                     else
   3294                     {
   3295                         impeg2d_format_convert(ps_dec_state,
   3296                                                ps_disp_pic,
   3297                                                ps_dst,
   3298                                                0,
   3299                                                ps_dec_state->u2_vertical_size);
   3300                     }
   3301                 }
   3302 
   3303                 if(ps_dec_state->u4_deinterlace)
   3304                 {
   3305                     if(ps_dec_state->ps_deint_pic)
   3306                     {
   3307                         impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg,
   3308                                                ps_dec_state->ps_deint_pic->i4_buf_id,
   3309                                                MPEG2_BUF_MGR_DEINT);
   3310                     }
   3311                     ps_dec_state->ps_deint_pic = ps_disp_pic;
   3312                 }
   3313                 if(0 == ps_dec_state->u4_share_disp_buf)
   3314                     impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_disp_pic->i4_buf_id, BUF_MGR_DISP);
   3315 
   3316                 ps_dec_op->s_ivd_video_decode_op_t.u4_pic_ht = ps_dec_state->u2_vertical_size;
   3317                 ps_dec_op->s_ivd_video_decode_op_t.u4_pic_wd = ps_dec_state->u2_horizontal_size;
   3318                 ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 1;
   3319 
   3320                 ps_dec_op->s_ivd_video_decode_op_t.u4_disp_buf_id = ps_disp_pic->i4_buf_id;
   3321                 ps_dec_op->s_ivd_video_decode_op_t.u4_ts = ps_disp_pic->u4_ts;
   3322 
   3323                 ps_dec_op->s_ivd_video_decode_op_t.e_output_format = (IV_COLOR_FORMAT_T)ps_dec_state->i4_chromaFormat;
   3324 
   3325                 ps_dec_op->s_ivd_video_decode_op_t.u4_is_ref_flag = (B_PIC != ps_dec_state->e_pic_type);
   3326 
   3327                 ps_dec_op->s_ivd_video_decode_op_t.u4_progressive_frame_flag           = IV_PROGRESSIVE;
   3328 
   3329                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_wd = ps_dec_state->u2_horizontal_size;
   3330                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_strd = ps_dec_state->u4_frm_buf_stride;
   3331                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_ht = ps_dec_state->u2_vertical_size;
   3332 
   3333                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = ps_dec_state->u2_horizontal_size >> 1;
   3334                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_strd = ps_dec_state->u4_frm_buf_stride >> 1;
   3335                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_ht = ps_dec_state->u2_vertical_size >> 1;
   3336 
   3337                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_wd = ps_dec_state->u2_horizontal_size >> 1;
   3338                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_strd = ps_dec_state->u4_frm_buf_stride >> 1;
   3339                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_ht = ps_dec_state->u2_vertical_size >> 1;
   3340                 ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_size = sizeof(ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf);
   3341 
   3342                 switch(ps_dec_state->i4_chromaFormat)
   3343                 {
   3344                     case IV_YUV_420SP_UV:
   3345                     case IV_YUV_420SP_VU:
   3346                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = ps_dec_state->u2_horizontal_size;
   3347                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_strd = ps_dec_state->u4_frm_buf_stride;
   3348                     break;
   3349                     case IV_YUV_422ILE:
   3350                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = 0;
   3351                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_ht = 0;
   3352                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_wd = 0;
   3353                         ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_ht = 0;
   3354                     break;
   3355                     default:
   3356                     break;
   3357                 }
   3358 
   3359 
   3360             }
   3361             if(ps_dec_op->s_ivd_video_decode_op_t.u4_output_present)
   3362             {
   3363                 if(1 == ps_dec_op->s_ivd_video_decode_op_t.u4_output_present)
   3364                 {
   3365                     INSERT_LOGO(ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[0],
   3366                                 ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[1],
   3367                                 ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[2],
   3368                                 ps_dec_state->u4_frm_buf_stride,
   3369                                 ps_dec_state->u2_horizontal_size,
   3370                                 ps_dec_state->u2_vertical_size,
   3371                                 ps_dec_state->i4_chromaFormat,
   3372                                 ps_dec_state->u2_horizontal_size,
   3373                                 ps_dec_state->u2_vertical_size);
   3374                 }
   3375                 return(IV_SUCCESS);
   3376             }
   3377             else
   3378             {
   3379                 ps_dec_state->u1_flushfrm = 0;
   3380 
   3381                 return(IV_FAIL);
   3382             }
   3383 
   3384         }
   3385         else if(ps_dec_state->u1_flushfrm==0)
   3386         {
   3387             ps_dec_ip->s_ivd_video_decode_ip_t.u4_size                 = sizeof(impeg2d_video_decode_ip_t);
   3388             ps_dec_op->s_ivd_video_decode_op_t.u4_size                 = sizeof(impeg2d_video_decode_op_t);
   3389             if(ps_dec_ip->s_ivd_video_decode_ip_t.u4_num_Bytes < 4)
   3390             {
   3391                 ps_dec_op->s_ivd_video_decode_op_t.u4_num_bytes_consumed = ps_dec_ip->s_ivd_video_decode_ip_t.u4_num_Bytes;
   3392                 return(IV_FAIL);
   3393             }
   3394 
   3395             if(1 == ps_dec_state->u4_share_disp_buf)
   3396             {
   3397                 if(0 == impeg2_buf_mgr_check_free(ps_dec_state->pv_pic_buf_mg))
   3398                 {
   3399                     ps_dec_op->s_ivd_video_decode_op_t.u4_error_code =
   3400                                     (IMPEG2D_ERROR_CODES_T)IVD_DEC_REF_BUF_NULL;
   3401                     return IV_FAIL;
   3402                 }
   3403             }
   3404 
   3405 
   3406             ps_dec_op->s_ivd_video_decode_op_t.e_output_format = (IV_COLOR_FORMAT_T)ps_dec_state->i4_chromaFormat;
   3407 
   3408             ps_dec_op->s_ivd_video_decode_op_t.u4_is_ref_flag = (B_PIC != ps_dec_state->e_pic_type);
   3409 
   3410             ps_dec_op->s_ivd_video_decode_op_t.u4_progressive_frame_flag           = IV_PROGRESSIVE;
   3411 
   3412             if (0 == ps_dec_state->u4_frm_buf_stride)
   3413             {
   3414                 ps_dec_state->u4_frm_buf_stride = (ps_dec_state->u2_horizontal_size);
   3415             }
   3416 
   3417             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_wd = ps_dec_state->u2_horizontal_size;
   3418             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_strd = ps_dec_state->u4_frm_buf_stride;
   3419             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_ht = ps_dec_state->u2_vertical_size;
   3420 
   3421             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = ps_dec_state->u2_horizontal_size >> 1;
   3422             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_strd = ps_dec_state->u4_frm_buf_stride >> 1;
   3423             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_ht = ps_dec_state->u2_vertical_size >> 1;
   3424 
   3425             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_wd = ps_dec_state->u2_horizontal_size >> 1;
   3426             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_strd = ps_dec_state->u4_frm_buf_stride >> 1;
   3427             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_ht = ps_dec_state->u2_vertical_size >> 1;
   3428             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_size = sizeof(ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf);
   3429 
   3430             switch(ps_dec_state->i4_chromaFormat)
   3431             {
   3432                 case IV_YUV_420SP_UV:
   3433                 case IV_YUV_420SP_VU:
   3434                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = ps_dec_state->u2_horizontal_size;
   3435                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_strd = ps_dec_state->u4_frm_buf_stride;
   3436                 break;
   3437                 case IV_YUV_422ILE:
   3438                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_wd = 0;
   3439                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_u_ht = 0;
   3440                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_wd = 0;
   3441                     ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_v_ht = 0;
   3442                 break;
   3443                 default:
   3444                 break;
   3445             }
   3446 
   3447             if( ps_dec_state->u1_flushfrm == 0)
   3448             {
   3449                 ps_dec_state->u1_flushcnt    = 0;
   3450 
   3451                 ps_dec_state->ps_out_buf = &ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer;
   3452                 if (IV_SUCCESS != check_app_out_buf_size(ps_dec_state))
   3453                 {
   3454                     ps_dec_op->s_ivd_video_decode_op_t.u4_error_code = IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
   3455                     return IV_FAIL;
   3456                 }
   3457 
   3458                 /*************************************************************************/
   3459                 /*                              Frame Decode                             */
   3460                 /*************************************************************************/
   3461                 ps_dec_state->u4_inp_ts = ps_dec_ip->s_ivd_video_decode_ip_t.u4_ts;
   3462 
   3463                 impeg2d_dec_frm(ps_dec_state,ps_dec_ip,ps_dec_op);
   3464 
   3465                 if (IVD_ERROR_NONE ==
   3466                         ps_dec_op->s_ivd_video_decode_op_t.u4_error_code)
   3467                 {
   3468                     if(ps_dec_state->u1_first_frame_done == 0)
   3469                     {
   3470                         ps_dec_state->u1_first_frame_done = 1;
   3471                     }
   3472 
   3473                     if(ps_dec_state->ps_disp_pic)
   3474                     {
   3475                         ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 1;
   3476                         switch(ps_dec_state->ps_disp_pic->e_pic_type)
   3477                         {
   3478                             case I_PIC :
   3479                             ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
   3480                             break;
   3481 
   3482                             case P_PIC:
   3483                             ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_P_FRAME;
   3484                             break;
   3485 
   3486                             case B_PIC:
   3487                             ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_B_FRAME;
   3488                             break;
   3489 
   3490                             case D_PIC:
   3491                             ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
   3492                             break;
   3493 
   3494                             default :
   3495                             ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_FRAMETYPE_DEFAULT;
   3496                             break;
   3497                         }
   3498                     }
   3499                     else
   3500                     {
   3501                         ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0;
   3502                         ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_NA_FRAME;
   3503                     }
   3504 
   3505                     ps_dec_state->u4_num_frames_decoded++;
   3506                 }
   3507             }
   3508             else
   3509             {
   3510                 ps_dec_state->u1_flushcnt++;
   3511             }
   3512         }
   3513         if(ps_dec_state->ps_disp_pic)
   3514         {
   3515             ps_dec_op->s_ivd_video_decode_op_t.u4_disp_buf_id = ps_dec_state->ps_disp_pic->i4_buf_id;
   3516             ps_dec_op->s_ivd_video_decode_op_t.u4_ts = ps_dec_state->ps_disp_pic->u4_ts;
   3517 
   3518             if(0 == ps_dec_state->u4_share_disp_buf)
   3519             {
   3520                 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->ps_disp_pic->i4_buf_id, BUF_MGR_DISP);
   3521             }
   3522         }
   3523 
   3524         if(ps_dec_state->u4_deinterlace)
   3525         {
   3526             if(ps_dec_state->ps_deint_pic)
   3527             {
   3528                 impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg,
   3529                                        ps_dec_state->ps_deint_pic->i4_buf_id,
   3530                                        MPEG2_BUF_MGR_DEINT);
   3531             }
   3532             ps_dec_state->ps_deint_pic = ps_dec_state->ps_disp_pic;
   3533         }
   3534 
   3535         if(1 == ps_dec_op->s_ivd_video_decode_op_t.u4_output_present)
   3536         {
   3537             INSERT_LOGO(ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[0],
   3538                         ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[1],
   3539                         ps_dec_ip->s_ivd_video_decode_ip_t.s_out_buffer.pu1_bufs[2],
   3540                         ps_dec_state->u4_frm_buf_stride,
   3541                         ps_dec_state->u2_horizontal_size,
   3542                         ps_dec_state->u2_vertical_size,
   3543                         ps_dec_state->i4_chromaFormat,
   3544                         ps_dec_state->u2_horizontal_size,
   3545                         ps_dec_state->u2_vertical_size);
   3546         }
   3547 
   3548     }
   3549 
   3550     ps_dec_op->s_ivd_video_decode_op_t.u4_progressive_frame_flag = 1;
   3551     ps_dec_op->s_ivd_video_decode_op_t.e4_fld_type     = ps_dec_state->s_disp_op.e4_fld_type;
   3552 
   3553 
   3554     if(ps_dec_op->s_ivd_video_decode_op_t.u4_error_code)
   3555         return IV_FAIL;
   3556     else
   3557         return IV_SUCCESS;
   3558 }
   3559