• 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         : ih264d_format_conv.c                                */
23  /*                                                                           */
24  /*  Description       : Contains functions needed to convert the images in   */
25  /*                      different color spaces to yuv 422i color space       */
26  /*                                                                           */
27  /*                                                                           */
28  /*  Issues / Problems : None                                                 */
29  /*                                                                           */
30  /*  Revision History  :                                                      */
31  /*                                                                           */
32  /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
33  /*         28 08 2007  Naveen Kumar T        Draft                           */
34  /*                                                                           */
35  /*****************************************************************************/
36  /*****************************************************************************/
37  /* File Includes                                                             */
38  /*****************************************************************************/
39  
40  /* System include files */
41  #include <string.h>
42  /* User include files */
43  #include "ih264_typedefs.h"
44  #include "iv.h"
45  #include "ih264_macros.h"
46  #include "ih264_platform_macros.h"
47  #include "ih264d_structs.h"
48  #include "ih264d_format_conv.h"
49  #include "ih264d_defs.h"
50  
51  
52  
53  #ifdef LOGO_EN
54  #include "ih264d_ittiam_logo.h"
55  #define INSERT_LOGO(pu1_buf_y,pu1_buf_u,pu1_buf_v, u4_stride, u4_x_pos, u4_y_pos, u4_yuv_fmt, u4_disp_wd, u4_disp_ht) \
56                      ih264d_insert_logo(pu1_buf_y,pu1_buf_u,pu1_buf_v, u4_stride,\
57                            u4_x_pos, u4_y_pos, u4_yuv_fmt, u4_disp_wd, u4_disp_ht)
58  #else
59  #define INSERT_LOGO(pu1_buf_y,pu1_buf_u,pu1_buf_v, u4_stride, u4_x_pos, u4_y_pos, u4_yuv_fmt, u4_disp_wd, u4_disp_ht)
60  #endif
61  
62  /**
63   *******************************************************************************
64   *
65   * @brief Function used from copying a 420SP buffer
66   *
67   * @par   Description
68   * Function used from copying a 420SP buffer
69   *
70   * @param[in] pu1_y_src
71   *   Input Y pointer
72   *
73   * @param[in] pu1_uv_src
74   *   Input UV pointer (UV is interleaved either in UV or VU format)
75   *
76   * @param[in] pu1_y_dst
77   *   Output Y pointer
78   *
79   * @param[in] pu1_uv_dst
80   *   Output UV pointer (UV is interleaved in the same format as that of input)
81   *
82   * @param[in] wd
83   *   Width
84   *
85   * @param[in] ht
86   *   Height
87   *
88   * @param[in] src_y_strd
89   *   Input Y Stride
90   *
91   * @param[in] src_uv_strd
92   *   Input UV stride
93   *
94   * @param[in] dst_y_strd
95   *   Output Y stride
96   *
97   * @param[in] dst_uv_strd
98   *   Output UV stride
99   *
100   * @returns None
101   *
102   * @remarks In case there is a need to perform partial frame copy then
103   * by passion appropriate source and destination pointers and appropriate
104   * values for wd and ht it can be done
105   *
106   *******************************************************************************
107   */
ih264d_fmt_conv_420sp_to_rgb565(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD16 * pu2_rgb_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_strd,WORD32 is_u_first)108  void ih264d_fmt_conv_420sp_to_rgb565(UWORD8 *pu1_y_src,
109                                       UWORD8 *pu1_uv_src,
110                                       UWORD16 *pu2_rgb_dst,
111                                       WORD32 wd,
112                                       WORD32 ht,
113                                       WORD32 src_y_strd,
114                                       WORD32 src_uv_strd,
115                                       WORD32 dst_strd,
116                                       WORD32 is_u_first)
117  {
118  
119      WORD16 i2_r, i2_g, i2_b;
120      UWORD32 u4_r, u4_g, u4_b;
121      WORD16 i2_i, i2_j;
122      UWORD8 *pu1_y_src_nxt;
123      UWORD16 *pu2_rgb_dst_next_row;
124  
125      UWORD8 *pu1_u_src, *pu1_v_src;
126  
127      if(is_u_first)
128      {
129          pu1_u_src = (UWORD8 *)pu1_uv_src;
130          pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
131      }
132      else
133      {
134          pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
135          pu1_v_src = (UWORD8 *)pu1_uv_src;
136      }
137  
138      pu1_y_src_nxt = pu1_y_src + src_y_strd;
139      pu2_rgb_dst_next_row = pu2_rgb_dst + dst_strd;
140  
141      for(i2_i = 0; i2_i < (ht >> 1); i2_i++)
142      {
143          for(i2_j = (wd >> 1); i2_j > 0; i2_j--)
144          {
145              i2_b = ((*pu1_u_src - 128) * COEFF4 >> 13);
146              i2_g = ((*pu1_u_src - 128) * COEFF2 + (*pu1_v_src - 128) * COEFF3)
147                              >> 13;
148              i2_r = ((*pu1_v_src - 128) * COEFF1) >> 13;
149  
150              pu1_u_src += 2;
151              pu1_v_src += 2;
152              /* pixel 0 */
153              /* B */
154              u4_b = CLIP_U8(*pu1_y_src + i2_b);
155              u4_b >>= 3;
156              /* G */
157              u4_g = CLIP_U8(*pu1_y_src + i2_g);
158              u4_g >>= 2;
159              /* R */
160              u4_r = CLIP_U8(*pu1_y_src + i2_r);
161              u4_r >>= 3;
162  
163              pu1_y_src++;
164              *pu2_rgb_dst++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
165  
166              /* pixel 1 */
167              /* B */
168              u4_b = CLIP_U8(*pu1_y_src + i2_b);
169              u4_b >>= 3;
170              /* G */
171              u4_g = CLIP_U8(*pu1_y_src + i2_g);
172              u4_g >>= 2;
173              /* R */
174              u4_r = CLIP_U8(*pu1_y_src + i2_r);
175              u4_r >>= 3;
176  
177              pu1_y_src++;
178              *pu2_rgb_dst++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
179  
180              /* pixel 2 */
181              /* B */
182              u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
183              u4_b >>= 3;
184              /* G */
185              u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
186              u4_g >>= 2;
187              /* R */
188              u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
189              u4_r >>= 3;
190  
191              pu1_y_src_nxt++;
192              *pu2_rgb_dst_next_row++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
193  
194              /* pixel 3 */
195              /* B */
196              u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
197              u4_b >>= 3;
198              /* G */
199              u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
200              u4_g >>= 2;
201              /* R */
202              u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
203              u4_r >>= 3;
204  
205              pu1_y_src_nxt++;
206              *pu2_rgb_dst_next_row++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
207  
208          }
209  
210          pu1_u_src = pu1_u_src + src_uv_strd - wd;
211          pu1_v_src = pu1_v_src + src_uv_strd - wd;
212  
213          pu1_y_src = pu1_y_src + (src_y_strd << 1) - wd;
214          pu1_y_src_nxt = pu1_y_src_nxt + (src_y_strd << 1) - wd;
215  
216          pu2_rgb_dst = pu2_rgb_dst_next_row - wd + dst_strd;
217          pu2_rgb_dst_next_row = pu2_rgb_dst_next_row + (dst_strd << 1) - wd;
218      }
219  
220  }
221  
ih264d_fmt_conv_420sp_to_rgba8888(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD32 * pu4_rgba_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_strd,WORD32 is_u_first)222  void ih264d_fmt_conv_420sp_to_rgba8888(UWORD8 *pu1_y_src,
223                                         UWORD8 *pu1_uv_src,
224                                         UWORD32 *pu4_rgba_dst,
225                                         WORD32 wd,
226                                         WORD32 ht,
227                                         WORD32 src_y_strd,
228                                         WORD32 src_uv_strd,
229                                         WORD32 dst_strd,
230                                         WORD32 is_u_first)
231  {
232  
233      WORD16 i2_r, i2_g, i2_b;
234      UWORD32 u4_r, u4_g, u4_b;
235      WORD16 i2_i, i2_j;
236      UWORD8 *pu1_y_src_nxt;
237      UWORD32 *pu4_rgba_dst_next_row;
238  
239      UWORD8 *pu1_u_src, *pu1_v_src;
240  
241      if(is_u_first)
242      {
243          pu1_u_src = (UWORD8 *)pu1_uv_src;
244          pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
245      }
246      else
247      {
248          pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
249          pu1_v_src = (UWORD8 *)pu1_uv_src;
250      }
251  
252      pu1_y_src_nxt = pu1_y_src + src_y_strd;
253      pu4_rgba_dst_next_row = pu4_rgba_dst + dst_strd;
254  
255      for(i2_i = 0; i2_i < (ht >> 1); i2_i++)
256      {
257          for(i2_j = (wd >> 1); i2_j > 0; i2_j--)
258          {
259              i2_b = ((*pu1_u_src - 128) * COEFF4 >> 13);
260              i2_g = ((*pu1_u_src - 128) * COEFF2 + (*pu1_v_src - 128) * COEFF3)
261                              >> 13;
262              i2_r = ((*pu1_v_src - 128) * COEFF1) >> 13;
263  
264              pu1_u_src += 2;
265              pu1_v_src += 2;
266              /* pixel 0 */
267              /* B */
268              u4_b = CLIP_U8(*pu1_y_src + i2_b);
269              /* G */
270              u4_g = CLIP_U8(*pu1_y_src + i2_g);
271              /* R */
272              u4_r = CLIP_U8(*pu1_y_src + i2_r);
273  
274              pu1_y_src++;
275              *pu4_rgba_dst++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
276  
277              /* pixel 1 */
278              /* B */
279              u4_b = CLIP_U8(*pu1_y_src + i2_b);
280              /* G */
281              u4_g = CLIP_U8(*pu1_y_src + i2_g);
282              /* R */
283              u4_r = CLIP_U8(*pu1_y_src + i2_r);
284  
285              pu1_y_src++;
286              *pu4_rgba_dst++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
287  
288              /* pixel 2 */
289              /* B */
290              u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
291              /* G */
292              u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
293              /* R */
294              u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
295  
296              pu1_y_src_nxt++;
297              *pu4_rgba_dst_next_row++ =
298                              ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
299  
300              /* pixel 3 */
301              /* B */
302              u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
303              /* G */
304              u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
305              /* R */
306              u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
307  
308              pu1_y_src_nxt++;
309              *pu4_rgba_dst_next_row++ =
310                              ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
311  
312          }
313  
314          pu1_u_src = pu1_u_src + src_uv_strd - wd;
315          pu1_v_src = pu1_v_src + src_uv_strd - wd;
316  
317          pu1_y_src = pu1_y_src + (src_y_strd << 1) - wd;
318          pu1_y_src_nxt = pu1_y_src_nxt + (src_y_strd << 1) - wd;
319  
320          pu4_rgba_dst = pu4_rgba_dst_next_row - wd + dst_strd;
321          pu4_rgba_dst_next_row = pu4_rgba_dst_next_row + (dst_strd << 1) - wd;
322      }
323  
324  }
325  
326  /**
327   *******************************************************************************
328   *
329   * @brief Function used from copying a 420SP buffer
330   *
331   * @par   Description
332   * Function used from copying a 420SP buffer
333   *
334   * @param[in] pu1_y_src
335   *   Input Y pointer
336   *
337   * @param[in] pu1_uv_src
338   *   Input UV pointer (UV is interleaved either in UV or VU format)
339   *
340   * @param[in] pu1_y_dst
341   *   Output Y pointer
342   *
343   * @param[in] pu1_uv_dst
344   *   Output UV pointer (UV is interleaved in the same format as that of input)
345   *
346   * @param[in] wd
347   *   Width
348   *
349   * @param[in] ht
350   *   Height
351   *
352   * @param[in] src_y_strd
353   *   Input Y Stride
354   *
355   * @param[in] src_uv_strd
356   *   Input UV stride
357   *
358   * @param[in] dst_y_strd
359   *   Output Y stride
360   *
361   * @param[in] dst_uv_strd
362   *   Output UV stride
363   *
364   * @returns None
365   *
366   * @remarks In case there is a need to perform partial frame copy then
367   * by passion appropriate source and destination pointers and appropriate
368   * values for wd and ht it can be done
369   *
370   *******************************************************************************
371   */
372  
ih264d_fmt_conv_420sp_to_420sp(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD8 * pu1_y_dst,UWORD8 * pu1_uv_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_y_strd,WORD32 dst_uv_strd)373  void ih264d_fmt_conv_420sp_to_420sp(UWORD8 *pu1_y_src,
374                                      UWORD8 *pu1_uv_src,
375                                      UWORD8 *pu1_y_dst,
376                                      UWORD8 *pu1_uv_dst,
377                                      WORD32 wd,
378                                      WORD32 ht,
379                                      WORD32 src_y_strd,
380                                      WORD32 src_uv_strd,
381                                      WORD32 dst_y_strd,
382                                      WORD32 dst_uv_strd)
383  {
384      UWORD8 *pu1_src, *pu1_dst;
385      WORD32 num_rows, num_cols, src_strd, dst_strd;
386      WORD32 i;
387  
388      /* copy luma */
389      pu1_src = (UWORD8 *)pu1_y_src;
390      pu1_dst = (UWORD8 *)pu1_y_dst;
391  
392      num_rows = ht;
393      num_cols = wd;
394  
395      src_strd = src_y_strd;
396      dst_strd = dst_y_strd;
397  
398      for(i = 0; i < num_rows; i++)
399      {
400          memcpy(pu1_dst, pu1_src, num_cols);
401          pu1_dst += dst_strd;
402          pu1_src += src_strd;
403      }
404  
405      /* copy U and V */
406      pu1_src = (UWORD8 *)pu1_uv_src;
407      pu1_dst = (UWORD8 *)pu1_uv_dst;
408  
409      num_rows = ht >> 1;
410      num_cols = wd;
411  
412      src_strd = src_uv_strd;
413      dst_strd = dst_uv_strd;
414  
415      for(i = 0; i < num_rows; i++)
416      {
417          memcpy(pu1_dst, pu1_src, num_cols);
418          pu1_dst += dst_strd;
419          pu1_src += src_strd;
420      }
421      return;
422  }
423  
424  /**
425   *******************************************************************************
426   *
427   * @brief Function used from copying a 420SP buffer
428   *
429   * @par   Description
430   * Function used from copying a 420SP buffer
431   *
432   * @param[in] pu1_y_src
433   *   Input Y pointer
434   *
435   * @param[in] pu1_uv_src
436   *   Input UV pointer (UV is interleaved either in UV or VU format)
437   *
438   * @param[in] pu1_y_dst
439   *   Output Y pointer
440   *
441   * @param[in] pu1_uv_dst
442   *   Output UV pointer (UV is interleaved in the same format as that of input)
443   *
444   * @param[in] wd
445   *   Width
446   *
447   * @param[in] ht
448   *   Height
449   *
450   * @param[in] src_y_strd
451   *   Input Y Stride
452   *
453   * @param[in] src_uv_strd
454   *   Input UV stride
455   *
456   * @param[in] dst_y_strd
457   *   Output Y stride
458   *
459   * @param[in] dst_uv_strd
460   *   Output UV stride
461   *
462   * @returns None
463   *
464   * @remarks In case there is a need to perform partial frame copy then
465   * by passion appropriate source and destination pointers and appropriate
466   * values for wd and ht it can be done
467   *
468   *******************************************************************************
469   */
ih264d_fmt_conv_420sp_to_420sp_swap_uv(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD8 * pu1_y_dst,UWORD8 * pu1_uv_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_y_strd,WORD32 dst_uv_strd)470  void ih264d_fmt_conv_420sp_to_420sp_swap_uv(UWORD8 *pu1_y_src,
471                                              UWORD8 *pu1_uv_src,
472                                              UWORD8 *pu1_y_dst,
473                                              UWORD8 *pu1_uv_dst,
474                                              WORD32 wd,
475                                              WORD32 ht,
476                                              WORD32 src_y_strd,
477                                              WORD32 src_uv_strd,
478                                              WORD32 dst_y_strd,
479                                              WORD32 dst_uv_strd)
480  {
481      UWORD8 *pu1_src, *pu1_dst;
482      WORD32 num_rows, num_cols, src_strd, dst_strd;
483      WORD32 i;
484  
485      /* copy luma */
486      pu1_src = (UWORD8 *)pu1_y_src;
487      pu1_dst = (UWORD8 *)pu1_y_dst;
488  
489      num_rows = ht;
490      num_cols = wd;
491  
492      src_strd = src_y_strd;
493      dst_strd = dst_y_strd;
494  
495      for(i = 0; i < num_rows; i++)
496      {
497          memcpy(pu1_dst, pu1_src, num_cols);
498          pu1_dst += dst_strd;
499          pu1_src += src_strd;
500      }
501  
502      /* copy U and V */
503      pu1_src = (UWORD8 *)pu1_uv_src;
504      pu1_dst = (UWORD8 *)pu1_uv_dst;
505  
506      num_rows = ht >> 1;
507      num_cols = wd;
508  
509      src_strd = src_uv_strd;
510      dst_strd = dst_uv_strd;
511  
512      for(i = 0; i < num_rows; i++)
513      {
514          WORD32 j;
515          for(j = 0; j < num_cols; j += 2)
516          {
517              pu1_dst[j + 0] = pu1_src[j + 1];
518              pu1_dst[j + 1] = pu1_src[j + 0];
519          }
520          pu1_dst += dst_strd;
521          pu1_src += src_strd;
522      }
523      return;
524  }
525  /**
526   *******************************************************************************
527   *
528   * @brief Function used from copying a 420SP buffer
529   *
530   * @par   Description
531   * Function used from copying a 420SP buffer
532   *
533   * @param[in] pu1_y_src
534   *   Input Y pointer
535   *
536   * @param[in] pu1_uv_src
537   *   Input UV pointer (UV is interleaved either in UV or VU format)
538   *
539   * @param[in] pu1_y_dst
540   *   Output Y pointer
541   *
542   * @param[in] pu1_u_dst
543   *   Output U pointer
544   *
545   * @param[in] pu1_v_dst
546   *   Output V pointer
547   *
548   * @param[in] wd
549   *   Width
550   *
551   * @param[in] ht
552   *   Height
553   *
554   * @param[in] src_y_strd
555   *   Input Y Stride
556   *
557   * @param[in] src_uv_strd
558   *   Input UV stride
559   *
560   * @param[in] dst_y_strd
561   *   Output Y stride
562   *
563   * @param[in] dst_uv_strd
564   *   Output UV stride
565   *
566   * @param[in] is_u_first
567   *   Flag to indicate if U is the first byte in input chroma part
568   *
569   * @returns none
570   *
571   * @remarks In case there is a need to perform partial frame copy then
572   * by passion appropriate source and destination pointers and appropriate
573   * values for wd and ht it can be done
574   *
575   *******************************************************************************
576   */
577  
ih264d_fmt_conv_420sp_to_420p(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD8 * pu1_y_dst,UWORD8 * pu1_u_dst,UWORD8 * pu1_v_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_y_strd,WORD32 dst_uv_strd,WORD32 is_u_first,WORD32 disable_luma_copy)578  void ih264d_fmt_conv_420sp_to_420p(UWORD8 *pu1_y_src,
579                                     UWORD8 *pu1_uv_src,
580                                     UWORD8 *pu1_y_dst,
581                                     UWORD8 *pu1_u_dst,
582                                     UWORD8 *pu1_v_dst,
583                                     WORD32 wd,
584                                     WORD32 ht,
585                                     WORD32 src_y_strd,
586                                     WORD32 src_uv_strd,
587                                     WORD32 dst_y_strd,
588                                     WORD32 dst_uv_strd,
589                                     WORD32 is_u_first,
590                                     WORD32 disable_luma_copy)
591  {
592      UWORD8 *pu1_src, *pu1_dst;
593      UWORD8 *pu1_u_src, *pu1_v_src;
594      WORD32 num_rows, num_cols, src_strd, dst_strd;
595      WORD32 i, j;
596  
597      if(0 == disable_luma_copy)
598      {
599          /* copy luma */
600          pu1_src = (UWORD8 *)pu1_y_src;
601          pu1_dst = (UWORD8 *)pu1_y_dst;
602  
603          num_rows = ht;
604          num_cols = wd;
605  
606          src_strd = src_y_strd;
607          dst_strd = dst_y_strd;
608  
609          for(i = 0; i < num_rows; i++)
610          {
611              memcpy(pu1_dst, pu1_src, num_cols);
612              pu1_dst += dst_strd;
613              pu1_src += src_strd;
614          }
615      }
616      /* de-interleave U and V and copy to destination */
617      if(is_u_first)
618      {
619          pu1_u_src = (UWORD8 *)pu1_uv_src;
620          pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
621      }
622      else
623      {
624          pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
625          pu1_v_src = (UWORD8 *)pu1_uv_src;
626      }
627  
628      num_rows = ht >> 1;
629      num_cols = wd >> 1;
630  
631      src_strd = src_uv_strd;
632      dst_strd = dst_uv_strd;
633  
634      for(i = 0; i < num_rows; i++)
635      {
636          for(j = 0; j < num_cols; j++)
637          {
638              pu1_u_dst[j] = pu1_u_src[j * 2];
639              pu1_v_dst[j] = pu1_v_src[j * 2];
640          }
641  
642          pu1_u_dst += dst_strd;
643          pu1_v_dst += dst_strd;
644          pu1_u_src += src_strd;
645          pu1_v_src += src_strd;
646      }
647      return;
648  }
649  
650  /*****************************************************************************/
651  /*  Function Name : ih264d_format_convert                                    */
652  /*                                                                           */
653  /*  Description   : Implements format conversion/frame copy                  */
654  /*  Inputs        : ps_dec - Decoder parameters                              */
655  /*  Globals       : None                                                     */
656  /*  Processing    : Refer bumping process in the standard                    */
657  /*  Outputs       : Assigns display sequence number.                         */
658  /*  Returns       : None                                                     */
659  /*                                                                           */
660  /*  Issues        : None                                                     */
661  /*                                                                           */
662  /*  Revision History:                                                        */
663  /*                                                                           */
664  /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
665  /*         27 04 2005   NS              Draft                                */
666  /*                                                                           */
667  /*****************************************************************************/
ih264d_format_convert(dec_struct_t * ps_dec,ivd_get_display_frame_op_t * pv_disp_op,UWORD32 u4_start_y,UWORD32 u4_num_rows_y)668  void ih264d_format_convert(dec_struct_t *ps_dec,
669                             ivd_get_display_frame_op_t *pv_disp_op,
670                             UWORD32 u4_start_y,
671                             UWORD32 u4_num_rows_y)
672  {
673      UWORD32 convert_uv_only = 0;
674      iv_yuv_buf_t *ps_op_frm;
675      UWORD8 *pu1_y_src, *pu1_uv_src;
676      UWORD32 start_uv = u4_start_y >> 1;
677  
678      if(1 == pv_disp_op->u4_error_code)
679          return;
680  
681      ps_op_frm = &(ps_dec->s_disp_frame_info);
682  
683      /* Requires u4_start_y and u4_num_rows_y to be even */
684      if(u4_start_y & 1)
685      {
686          return;
687      }
688  
689      if((1 == ps_dec->u4_share_disp_buf) &&
690         (pv_disp_op->e_output_format == IV_YUV_420SP_UV))
691      {
692          return;
693      }
694  
695      pu1_y_src = (UWORD8 *)ps_op_frm->pv_y_buf;
696      pu1_y_src += u4_start_y * ps_op_frm->u4_y_strd,
697  
698      pu1_uv_src = (UWORD8 *)ps_op_frm->pv_u_buf;
699      pu1_uv_src += start_uv * ps_op_frm->u4_u_strd;
700  
701      if(pv_disp_op->e_output_format == IV_YUV_420P)
702      {
703          UWORD8 *pu1_y_dst, *pu1_u_dst, *pu1_v_dst;
704          IV_COLOR_FORMAT_T e_output_format = pv_disp_op->e_output_format;
705  
706          if(0 == ps_dec->u4_share_disp_buf)
707          {
708              convert_uv_only = 0;
709          }
710          else
711          {
712              convert_uv_only = 1;
713          }
714  
715          pu1_y_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
716          pu1_y_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
717  
718          pu1_u_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf;
719          pu1_u_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_u_strd;
720  
721          pu1_v_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_v_buf;
722          pu1_v_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_v_strd;
723  
724          ih264d_fmt_conv_420sp_to_420p(pu1_y_src,
725                                        pu1_uv_src,
726                                        pu1_y_dst,
727                                        pu1_u_dst,
728                                        pu1_v_dst,
729                                        ps_op_frm->u4_y_wd,
730                                        u4_num_rows_y,
731                                        ps_op_frm->u4_y_strd,
732                                        ps_op_frm->u4_u_strd,
733                                        pv_disp_op->s_disp_frm_buf.u4_y_strd,
734                                        pv_disp_op->s_disp_frm_buf.u4_u_strd,
735                                        1,
736                                        convert_uv_only);
737  
738      }
739      else if((pv_disp_op->e_output_format == IV_YUV_420SP_UV) ||
740              (pv_disp_op->e_output_format == IV_YUV_420SP_VU))
741      {
742          UWORD8* pu1_y_dst, *pu1_uv_dst;
743  
744          pu1_y_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
745          pu1_y_dst +=  u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
746  
747          pu1_uv_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf;
748          pu1_uv_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_u_strd;
749  
750          if(pv_disp_op->e_output_format == IV_YUV_420SP_UV)
751          {
752              ih264d_fmt_conv_420sp_to_420sp(pu1_y_src,
753                                             pu1_uv_src,
754                                             pu1_y_dst,
755                                             pu1_uv_dst,
756                                             ps_op_frm->u4_y_wd,
757                                             u4_num_rows_y,
758                                             ps_op_frm->u4_y_strd,
759                                             ps_op_frm->u4_u_strd,
760                                             pv_disp_op->s_disp_frm_buf.u4_y_strd,
761                                             pv_disp_op->s_disp_frm_buf.u4_u_strd);
762          }
763          else
764          {
765              ih264d_fmt_conv_420sp_to_420sp_swap_uv(pu1_y_src,
766                                                     pu1_uv_src,
767                                                     pu1_y_dst,
768                                                     pu1_uv_dst,
769                                                     ps_op_frm->u4_y_wd,
770                                                     u4_num_rows_y,
771                                                     ps_op_frm->u4_y_strd,
772                                                     ps_op_frm->u4_u_strd,
773                                                     pv_disp_op->s_disp_frm_buf.u4_y_strd,
774                                                     pv_disp_op->s_disp_frm_buf.u4_u_strd);
775          }
776      }
777      else if(pv_disp_op->e_output_format == IV_RGB_565)
778      {
779          UWORD16 *pu2_rgb_dst;
780  
781          pu2_rgb_dst = (UWORD16 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
782          pu2_rgb_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
783  
784          ih264d_fmt_conv_420sp_to_rgb565(pu1_y_src,
785                                          pu1_uv_src,
786                                          pu2_rgb_dst,
787                                          ps_op_frm->u4_y_wd,
788                                          u4_num_rows_y,
789                                          ps_op_frm->u4_y_strd,
790                                          ps_op_frm->u4_u_strd,
791                                          pv_disp_op->s_disp_frm_buf.u4_y_strd,
792                                          1);
793      }
794  
795      if((u4_start_y + u4_num_rows_y) >= ps_dec->s_disp_frame_info.u4_y_ht)
796      {
797  
798          INSERT_LOGO(pv_disp_op->s_disp_frm_buf.pv_y_buf,
799                          pv_disp_op->s_disp_frm_buf.pv_u_buf,
800                          pv_disp_op->s_disp_frm_buf.pv_v_buf,
801                          pv_disp_op->s_disp_frm_buf.u4_y_strd,
802                          ps_dec->u2_disp_width,
803                          ps_dec->u2_disp_height,
804                          pv_disp_op->e_output_format,
805                          ps_op_frm->u4_y_wd,
806                          ps_op_frm->u4_y_ht);
807      }
808  
809      return;
810  }
811