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