Home | History | Annotate | Download | only in common
      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         : ih264_weighted_pred.c                                */
     23 /*                                                                           */
     24 /*  Description       : Contains function definitions for weighted           */
     25 /*                      prediction functions                                 */
     26 /*                                                                           */
     27 /*  List of Functions : ih264_default_weighted_pred_luma()                   */
     28 /*                      ih264_default_weighted_pred_chroma()                 */
     29 /*                      ih264_weighted_pred_luma()                           */
     30 /*                      ih264_weighted_pred_chroma()                         */
     31 /*                      ih264_weighted_bipred_luma()                         */
     32 /*                      ih264_weighted_bipred_chroma()                       */
     33 /*                                                                           */
     34 /*  Issues / Problems : None                                                 */
     35 /*                                                                           */
     36 /*  Revision History  :                                                      */
     37 /*                                                                           */
     38 /*         DD MM YYYY   Author(s)       Changes                              */
     39 /*         07 01 2015   Kaushik         Initial version                      */
     40 /*                      Senthoor                                             */
     41 /*                                                                           */
     42 /*****************************************************************************/
     43 /*****************************************************************************/
     44 /* File Includes                                                             */
     45 /*****************************************************************************/
     46 
     47 /* User include files */
     48 #include "ih264_typedefs.h"
     49 #include "ih264_macros.h"
     50 #include "ih264_platform_macros.h"
     51 #include "ih264_weighted_pred.h"
     52 
     53 /*****************************************************************************/
     54 /*  Function definitions .                                                   */
     55 /*****************************************************************************/
     56 /*****************************************************************************/
     57 /*                                                                           */
     58 /*  Function Name : ih264_default_weighted_pred_luma                         */
     59 /*                                                                           */
     60 /*  Description   : This function performs the default weighted prediction   */
     61 /*                  as described in sec 8.4.2.3.1 titled "Default weighted   */
     62 /*                  sample prediction process" for luma. The function gets   */
     63 /*                  two ht x wd blocks, calculates their rounded-average and */
     64 /*                  stores it in the destination block. (ht,wd) can be       */
     65 /*                  (4,4), (8,4), (4,8), (8,8), (16,8), (8,16) or (16,16).   */
     66 /*                                                                           */
     67 /*  Inputs        : puc_src1  - Pointer to source 1                          */
     68 /*                  puc_src2  - Pointer to source 2                          */
     69 /*                  puc_dst   - Pointer to destination                       */
     70 /*                  src_strd1 - stride for source 1                          */
     71 /*                  src_strd1 - stride for source 2                          */
     72 /*                  dst_strd  - stride for destination                       */
     73 /*                  ht        - height of the block                          */
     74 /*                  wd        - width of the block                           */
     75 /*                                                                           */
     76 /*  Issues        : None                                                     */
     77 /*                                                                           */
     78 /*  Revision History:                                                        */
     79 /*                                                                           */
     80 /*         DD MM YYYY   Author(s)       Changes                              */
     81 /*         07 01 2015   Kaushik         Initial Version                      */
     82 /*                      Senthoor                                             */
     83 /*                                                                           */
     84 /*****************************************************************************/
     85 void ih264_default_weighted_pred_luma(UWORD8 *pu1_src1,
     86                                       UWORD8 *pu1_src2,
     87                                       UWORD8 *pu1_dst,
     88                                       WORD32 src_strd1,
     89                                       WORD32 src_strd2,
     90                                       WORD32 dst_strd,
     91                                       WORD32 ht,
     92                                       WORD32 wd)
     93 {
     94     WORD32 i, j;
     95 
     96     src_strd1 -= wd;
     97     src_strd2 -= wd;
     98     dst_strd -= wd;
     99 
    100     for(i = 0; i < ht; i++)
    101     {
    102         for(j = 0; j < wd; j++, pu1_src1++, pu1_src2++, pu1_dst++)
    103             *pu1_dst = (*pu1_src1 + *pu1_src2 + 1) >> 1;
    104 
    105         pu1_src1 += src_strd1;
    106         pu1_src2 += src_strd2;
    107         pu1_dst += dst_strd;
    108     }
    109 }
    110 
    111 /*****************************************************************************/
    112 /*                                                                           */
    113 /*  Function Name : ih264_default_weighted_pred_chroma                       */
    114 /*                                                                           */
    115 /*  Description   : This function performs the default weighted prediction   */
    116 /*                  as described in sec 8.4.2.3.1 titled "Default weighted   */
    117 /*                  sample prediction process" for chroma. The function gets */
    118 /*                  two ht x wd blocks, calculates their rounded-average and */
    119 /*                  stores it in the destination block. (ht,wd) can be       */
    120 /*                  (2,2), (4,2) , (2,4), (4,4), (8,4), (4,8) or (8,8).      */
    121 /*                                                                           */
    122 /*  Inputs        : puc_src1  - Pointer to source 1                          */
    123 /*                  puc_src2  - Pointer to source 2                          */
    124 /*                  puc_dst   - Pointer to destination                       */
    125 /*                  src_strd1 - stride for source 1                          */
    126 /*                  src_strd1 - stride for source 2                          */
    127 /*                  dst_strd  - stride for destination                       */
    128 /*                  ht        - height of the block                          */
    129 /*                  wd        - width of the block                           */
    130 /*                                                                           */
    131 /*  Issues        : None                                                     */
    132 /*                                                                           */
    133 /*  Revision History:                                                        */
    134 /*                                                                           */
    135 /*         DD MM YYYY   Author(s)       Changes                              */
    136 /*         07 01 2015   Kaushik         Initial Version                      */
    137 /*                      Senthoor                                             */
    138 /*                                                                           */
    139 /*****************************************************************************/
    140 void ih264_default_weighted_pred_chroma(UWORD8 *pu1_src1,
    141                                         UWORD8 *pu1_src2,
    142                                         UWORD8 *pu1_dst,
    143                                         WORD32 src_strd1,
    144                                         WORD32 src_strd2,
    145                                         WORD32 dst_strd,
    146                                         WORD32 ht,
    147                                         WORD32 wd)
    148 {
    149     WORD32 i, j;
    150 
    151     wd = wd << 1;
    152 
    153     src_strd1 -= wd;
    154     src_strd2 -= wd;
    155     dst_strd -= wd;
    156 
    157     for(i = 0; i < ht; i++)
    158     {
    159         for(j = 0; j < wd; j++, pu1_src1++, pu1_src2++, pu1_dst++)
    160             *pu1_dst = (*pu1_src1 + *pu1_src2 + 1) >> 1;
    161 
    162         pu1_src1 += src_strd1;
    163         pu1_src2 += src_strd2;
    164         pu1_dst += dst_strd;
    165     }
    166 }
    167 
    168 /*****************************************************************************/
    169 /*                                                                           */
    170 /*  Function Name : ih264_weighted_pred_luma                                 */
    171 /*                                                                           */
    172 /*  Description   : This function performs the weighted prediction as        */
    173 /*                  described in sec 8.4.2.3.2 titled "Weighted sample       */
    174 /*                  prediction process" for luma. The function gets one      */
    175 /*                  ht x wd block, weights it, rounds it off, offsets it,    */
    176 /*                  saturates it to unsigned 8-bit and stores it in the      */
    177 /*                  destination block. (ht,wd) can be (4,4), (8,4), (4,8),   */
    178 /*                  (8,8), (16,8), (8,16) or (16,16).                        */
    179 /*                                                                           */
    180 /*  Inputs        : puc_src  - Pointer to source                             */
    181 /*                  puc_dst  - Pointer to destination                        */
    182 /*                  src_strd - stride for source                             */
    183 /*                  dst_strd - stride for destination                        */
    184 /*                  log_wd   - number of bits to be rounded off              */
    185 /*                  wt       - weight value                                  */
    186 /*                  ofst     - offset value                                  */
    187 /*                  ht       - height of the block                           */
    188 /*                  wd       - width of the block                            */
    189 /*                                                                           */
    190 /*  Issues        : None                                                     */
    191 /*                                                                           */
    192 /*  Revision History:                                                        */
    193 /*                                                                           */
    194 /*         DD MM YYYY   Author(s)       Changes                              */
    195 /*         07 01 2015   Kaushik         Initial Version                      */
    196 /*                      Senthoor                                             */
    197 /*                                                                           */
    198 /*****************************************************************************/
    199 void ih264_weighted_pred_luma(UWORD8 *pu1_src,
    200                               UWORD8 *pu1_dst,
    201                               WORD32 src_strd,
    202                               WORD32 dst_strd,
    203                               WORD32 log_wd,
    204                               WORD32 wt,
    205                               WORD32 ofst,
    206                               WORD32 ht,
    207                               WORD32 wd)
    208 {
    209     WORD32 i, j;
    210 
    211     wt = (WORD16)(wt & 0xffff);
    212     ofst = (WORD8)(ofst & 0xff);
    213 
    214     src_strd -= wd;
    215     dst_strd -= wd;
    216 
    217     if(log_wd >= 1)
    218     {
    219         WORD32 i_ofst = (1 << (log_wd - 1)) + (ofst << log_wd);
    220         for(i = 0; i < ht; i++)
    221         {
    222             for(j = 0; j < wd; j++, pu1_src++, pu1_dst++)
    223                 *pu1_dst = CLIP_U8((wt * (*pu1_src) + i_ofst) >> log_wd);
    224 
    225             pu1_src += src_strd;
    226             pu1_dst += dst_strd;
    227         }
    228     }
    229     else
    230     {
    231         for(i = 0; i < ht; i++)
    232         {
    233             for(j = 0; j < wd; j++, pu1_src++, pu1_dst++)
    234                 *pu1_dst = CLIP_U8(wt * (*pu1_src) + ofst);
    235 
    236             pu1_src += src_strd;
    237             pu1_dst += dst_strd;
    238         }
    239     }
    240 }
    241 
    242 /*****************************************************************************/
    243 /*                                                                           */
    244 /*  Function Name : ih264_weighted_pred_chroma                               */
    245 /*                                                                           */
    246 /*  Description   : This function performs the weighted prediction as        */
    247 /*                  described in sec 8.4.2.3.2 titled "Weighted sample       */
    248 /*                  prediction process" for chroma. The function gets one    */
    249 /*                  ht x wd block, weights it, rounds it off, offsets it,    */
    250 /*                  saturates it to unsigned 8-bit and stores it in the      */
    251 /*                  destination block. (ht,wd) can be (2,2), (4,2), (2,4),   */
    252 /*                  (4,4), (8,4), (4,8) or (8,8).                            */
    253 /*                                                                           */
    254 /*  Inputs        : puc_src  - Pointer to source                             */
    255 /*                  puc_dst  - Pointer to destination                        */
    256 /*                  src_strd - stride for source                             */
    257 /*                  dst_strd - stride for destination                        */
    258 /*                  log_wd   - number of bits to be rounded off              */
    259 /*                  wt       - weight values for u and v                     */
    260 /*                  ofst     - offset values for u and v                     */
    261 /*                  ht       - height of the block                           */
    262 /*                  wd       - width of the block                            */
    263 /*                                                                           */
    264 /*  Issues        : None                                                     */
    265 /*                                                                           */
    266 /*  Revision History:                                                        */
    267 /*                                                                           */
    268 /*         DD MM YYYY   Author(s)       Changes                              */
    269 /*         07 01 2015   Kaushik         Initial Version                      */
    270 /*                      Senthoor                                             */
    271 /*                                                                           */
    272 /*****************************************************************************/
    273 void ih264_weighted_pred_chroma(UWORD8 *pu1_src,
    274                                 UWORD8 *pu1_dst,
    275                                 WORD32 src_strd,
    276                                 WORD32 dst_strd,
    277                                 WORD32 log_wd,
    278                                 WORD32 wt,
    279                                 WORD32 ofst,
    280                                 WORD32 ht,
    281                                 WORD32 wd)
    282 {
    283     WORD32 i, j;
    284     WORD32 wt_u, wt_v;
    285     WORD32 ofst_u, ofst_v;
    286 
    287     wt_u = (WORD16)(wt & 0xffff);
    288     wt_v = (WORD16)(wt >> 16);
    289 
    290     ofst_u = (WORD8)(ofst & 0xff);
    291     ofst_v = (WORD8)(ofst >> 8);
    292 
    293     src_strd -= wd << 1;
    294     dst_strd -= wd << 1;
    295 
    296     if(log_wd >= 1)
    297     {
    298         ofst_u = (1 << (log_wd - 1)) + (ofst_u << log_wd);
    299         ofst_v = (1 << (log_wd - 1)) + (ofst_v << log_wd);
    300 
    301         for(i = 0; i < ht; i++)
    302         {
    303             for(j = 0; j < wd; j++, pu1_src++, pu1_dst++)
    304             {
    305                 *pu1_dst = CLIP_U8((wt_u * (*pu1_src) + ofst_u) >> log_wd);
    306                 pu1_src++;
    307                 pu1_dst++;
    308                 *pu1_dst = CLIP_U8((wt_v * (*pu1_src) + ofst_v) >> log_wd);
    309             }
    310             pu1_src += src_strd;
    311             pu1_dst += dst_strd;
    312         }
    313     }
    314     else
    315     {
    316         for(i = 0; i < ht; i++)
    317         {
    318             for(j = 0; j < wd; j++, pu1_src++, pu1_dst++)
    319             {
    320                 *pu1_dst = CLIP_U8(wt_u * (*pu1_src) + ofst_u);
    321                 pu1_src++;
    322                 pu1_dst++;
    323                 *pu1_dst = CLIP_U8(wt_v * (*pu1_src) + ofst_v);
    324             }
    325             pu1_src += src_strd;
    326             pu1_dst += dst_strd;
    327         }
    328     }
    329 }
    330 
    331 /*****************************************************************************/
    332 /*                                                                           */
    333 /*  Function Name : ih264_weighted_bi_pred_luma                              */
    334 /*                                                                           */
    335 /*  Description   : This function performs the weighted biprediction as      */
    336 /*                  described in sec 8.4.2.3.2 titled "Weighted sample       */
    337 /*                  prediction process" for luma. The function gets two      */
    338 /*                  ht x wd blocks, weights them, adds them, rounds off the  */
    339 /*                  sum, offsets it, saturates it to unsigned 8-bit and      */
    340 /*                  stores it in the destination block. (ht,wd) can be       */
    341 /*                  (4,4), (8,4), (4,8), (8,8), (16,8), (8,16) or (16,16).   */
    342 /*                                                                           */
    343 /*  Inputs        : puc_src1  - Pointer to source 1                          */
    344 /*                  puc_src2  - Pointer to source 2                          */
    345 /*                  puc_dst   - Pointer to destination                       */
    346 /*                  src_strd1 - stride for source 1                          */
    347 /*                  src_strd2 - stride for source 2                          */
    348 /*                  dst_strd2 - stride for destination                       */
    349 /*                  log_wd    - number of bits to be rounded off             */
    350 /*                  wt1       - weight value for source 1                    */
    351 /*                  wt2       - weight value for source 2                    */
    352 /*                  ofst1     - offset value for source 1                    */
    353 /*                  ofst2     - offset value for source 2                    */
    354 /*                  ht        - height of the block                          */
    355 /*                  wd        - width of the block                           */
    356 /*                                                                           */
    357 /*  Issues        : None                                                     */
    358 /*                                                                           */
    359 /*  Revision History:                                                        */
    360 /*                                                                           */
    361 /*         DD MM YYYY   Author(s)       Changes                              */
    362 /*         07 01 2015   Kaushik         Initial Version                      */
    363 /*                      Senthoor                                             */
    364 /*                                                                           */
    365 /*****************************************************************************/
    366 void ih264_weighted_bi_pred_luma(UWORD8 *pu1_src1,
    367                                  UWORD8 *pu1_src2,
    368                                  UWORD8 *pu1_dst,
    369                                  WORD32 src_strd1,
    370                                  WORD32 src_strd2,
    371                                  WORD32 dst_strd,
    372                                  WORD32 log_wd,
    373                                  WORD32 wt1,
    374                                  WORD32 wt2,
    375                                  WORD32 ofst1,
    376                                  WORD32 ofst2,
    377                                  WORD32 ht,
    378                                  WORD32 wd)
    379 {
    380     WORD32 i, j;
    381     WORD32 shft, ofst;
    382 
    383     ofst1 = (WORD8)(ofst1 & 0xff);
    384     ofst2 = (WORD8)(ofst2 & 0xff);
    385     wt1 = (WORD16)(wt1 & 0xffff);
    386     wt2 = (WORD16)(wt2 & 0xffff);
    387     ofst = (ofst1 + ofst2 + 1) >> 1;
    388 
    389     shft = log_wd + 1;
    390     ofst = (1 << log_wd) + (ofst << shft);
    391 
    392     src_strd1 -= wd;
    393     src_strd2 -= wd;
    394     dst_strd -= wd;
    395 
    396     for(i = 0; i < ht; i++)
    397     {
    398         for(j = 0; j < wd; j++, pu1_src1++, pu1_src2++, pu1_dst++)
    399             *pu1_dst = CLIP_U8((wt1 * (*pu1_src1) + wt2 * (*pu1_src2) + ofst) >> shft);
    400 
    401         pu1_src1 += src_strd1;
    402         pu1_src2 += src_strd2;
    403         pu1_dst += dst_strd;
    404     }
    405 }
    406 
    407 /*****************************************************************************/
    408 /*                                                                           */
    409 /*  Function Name : ih264_weighted_bi_pred_chroma                            */
    410 /*                                                                           */
    411 /*  Description   : This function performs the weighted biprediction as      */
    412 /*                  described in sec 8.4.2.3.2 titled "Weighted sample       */
    413 /*                  prediction process" for chroma. The function gets two    */
    414 /*                  ht x wd blocks, weights them, adds them, rounds off the  */
    415 /*                  sum, offsets it, saturates it to unsigned 8-bit and      */
    416 /*                  stores it in the destination block. (ht,wd) can be       */
    417 /*                  (2,2), (4,2), (2,4), (4,4), (8,4), (4,8) or (8,8).       */
    418 /*                                                                           */
    419 /*  Inputs        : puc_src1  - Pointer to source 1                          */
    420 /*                  puc_src2  - Pointer to source 2                          */
    421 /*                  puc_dst   - Pointer to destination                       */
    422 /*                  src_strd1 - stride for source 1                          */
    423 /*                  src_strd2 - stride for source 2                          */
    424 /*                  dst_strd2 - stride for destination                       */
    425 /*                  log_wd    - number of bits to be rounded off             */
    426 /*                  wt1       - weight values for u and v in source 1        */
    427 /*                  wt2       - weight values for u and v in source 2        */
    428 /*                  ofst1     - offset value for u and v in source 1         */
    429 /*                  ofst2     - offset value for u and v in source 2         */
    430 /*                  ht        - height of the block                          */
    431 /*                  wd        - width of the block                           */
    432 /*                                                                           */
    433 /*  Issues        : None                                                     */
    434 /*                                                                           */
    435 /*  Revision History:                                                        */
    436 /*                                                                           */
    437 /*         DD MM YYYY   Author(s)       Changes                              */
    438 /*         07 01 2015   Kaushik         Initial Version                      */
    439 /*                      Senthoor                                             */
    440 /*                                                                           */
    441 /*****************************************************************************/
    442 void ih264_weighted_bi_pred_chroma(UWORD8 *pu1_src1,
    443                                    UWORD8 *pu1_src2,
    444                                    UWORD8 *pu1_dst,
    445                                    WORD32 src_strd1,
    446                                    WORD32 src_strd2,
    447                                    WORD32 dst_strd,
    448                                    WORD32 log_wd,
    449                                    WORD32 wt1,
    450                                    WORD32 wt2,
    451                                    WORD32 ofst1,
    452                                    WORD32 ofst2,
    453                                    WORD32 ht,
    454                                    WORD32 wd)
    455 {
    456     WORD32 i, j;
    457     WORD32 wt1_u, wt1_v, wt2_u, wt2_v;
    458     WORD32 ofst1_u, ofst1_v, ofst2_u, ofst2_v;
    459     WORD32 ofst_u, ofst_v;
    460     WORD32 shft;
    461 
    462     ofst1_u = (WORD8)(ofst1 & 0xff);
    463     ofst1_v = (WORD8)(ofst1 >> 8);
    464     ofst2_u = (WORD8)(ofst2 & 0xff);
    465     ofst2_v = (WORD8)(ofst2 >> 8);
    466     wt1_u = (WORD16)(wt1 & 0xffff);
    467     wt1_v = (WORD16)(wt1 >> 16);
    468     wt2_u = (WORD16)(wt2 & 0xffff);
    469     wt2_v = (WORD16)(wt2 >> 16);
    470     ofst_u = (ofst1_u + ofst2_u + 1) >> 1;
    471     ofst_v = (ofst1_v + ofst2_v + 1) >> 1;
    472 
    473     src_strd1 -= wd << 1;
    474     src_strd2 -= wd << 1;
    475     dst_strd -= wd << 1;
    476 
    477     shft = log_wd + 1;
    478     ofst_u = (1 << log_wd) + (ofst_u << shft);
    479     ofst_v = (1 << log_wd) + (ofst_v << shft);
    480 
    481     for(i = 0; i < ht; i++)
    482     {
    483         for(j = 0; j < wd; j++, pu1_src1++, pu1_src2++, pu1_dst++)
    484         {
    485             *pu1_dst = CLIP_U8((wt1_u * (*pu1_src1) + wt2_u * (*pu1_src2) + ofst_u) >> shft);
    486             pu1_src1++;
    487             pu1_src2++;
    488             pu1_dst++;
    489             *pu1_dst = CLIP_U8((wt1_v * (*pu1_src1) + wt2_v * (*pu1_src2) + ofst_v) >> shft);
    490         }
    491         pu1_src1 += src_strd1;
    492         pu1_src2 += src_strd2;
    493         pu1_dst += dst_strd;
    494     }
    495 }
    496