## liboilfuncs-doc liboilfuncs-doc |

## Synopsis

    void                oil_clip_f32                        (float *dest,
                                                             int dstr,
                                                             const float *src,
                                                             int sstr,
                                                             int n,
                                                             const float *s2_1,
                                                             const float *s3_1);
    void                oil_clip_f64                        (double *dest,
                                                             int dstr,
                                                             const double *src,
                                                             int sstr,
                                                             int n,
                                                             const double *s2_1,
                                                             const double *s3_1);
    void                oil_clip_s16                        (int16_t *dest,
                                                             int dstr,
                                                             const int16_t *src,
                                                             int sstr,
                                                             int n,
                                                             const int16_t *s2_1,
                                                             const int16_t *s3_1);
    void                oil_clip_s32                        (int32_t *dest,
                                                             int dstr,
                                                             const int32_t *src,
                                                             int sstr,
                                                             int n,
                                                             const int32_t *s2_1,
                                                             const int32_t *s3_1);
    void                oil_clip_s8                         (int8_t *dest,
                                                             int dstr,
                                                             const int8_t *src,
                                                             int sstr,
                                                             int n,
                                                             const int8_t *s2_1,
                                                             const int8_t *s3_1);
    void                oil_clip_u16                        (uint16_t *dest,
                                                             int dstr,
                                                             const uint16_t *src,
                                                             int sstr,
                                                             int n,
                                                             const uint16_t *s2_1,
                                                             const uint16_t *s3_1);
    void                oil_clip_u32                        (uint32_t *dest,
                                                             int dstr,
                                                             const uint32_t *src,
                                                             int sstr,
                                                             int n,
                                                             const uint32_t *s2_1,
                                                             const uint32_t *s3_1);
    void                oil_clip_u8                         (uint8_t *dest,
                                                             int dstr,
                                                             const uint8_t *src,
                                                             int sstr,
                                                             int n,
                                                             const uint8_t *s2_1,
                                                             const uint8_t *s3_1);
    void                oil_dequantize8x8_s16               (int16_t *d_8x8,
                                                             int dstr,
                                                             const int16_t *s1_8x8,
                                                             int sstr1,
                                                             const int16_t *s2_8x8,
                                                             int sstr2);
    void                oil_diffsquaresum_f64               (double *d_1,
                                                             const double *src1,
                                                             int sstr1,
                                                             const double *src2,
                                                             int sstr2,
                                                             int n);
    void                oil_md5                             (uint32_t *i_4,
                                                             const uint32_t *s_16);
    void                oil_mix_u8                          (uint8_t *dest,
                                                             const uint8_t *src1,
                                                             const uint8_t *src2,
                                                             const uint8_t *src3,
                                                             int n);
    void                oil_null                            (void);
    void                oil_scanlinescale2_u8               (uint8_t *d,
                                                             const uint8_t *s,
                                                             int n);
    void                oil_sincos_f64                      (double *dest1,
                                                             double *dest2,
                                                             int n,
                                                             const double *s1_1,
                                                             const double *s2_1);
    void                oil_utf8_validate                   (int32_t *d_1,
                                                             const uint8_t *s,
                                                             int n);
    void                oil_diff8x8_s16_u8                  (int16_t *d_8x8,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2);
    void                oil_diff8x8_average_s16_u8          (int16_t *d_8x8,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2,
                                                             const uint8_t *s3_8x8,
                                                             int ss3);
    void                oil_err_inter8x8_u8_avg             (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             const uint8_t *s3_8x8,
                                                             int ss2);
    void                oil_recon8x8_inter                  (uint8_t *d_8x8,
                                                             int ds,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const int16_t *s2_8x8);
    void                oil_err_intra8x8_u8                 (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1);
    void                oil_recon8x8_intra                  (uint8_t *d_8x8,
                                                             int ds,
                                                             const int16_t *s_8x8);
    void                oil_colsad8x8_u8                    (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2);
    void                oil_composite_over_u8               (uint8_t *i_n,
                                                             const uint8_t *s1_n,
                                                             int n);
    void                oil_diff8x8_const128_s16_u8         (int16_t *d_8x8,
                                                             const uint8_t *s1_8x8,
                                                             int ss1);
    void                oil_copy8x8_u8                      (uint8_t *d_8x8,
                                                             int ds,
                                                             const uint8_t *s_8x8,
                                                             int ss);
    void                oil_err_inter8x8_u8                 (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2);
    void                oil_fdct8x8theora                   (const int16_t *s_8x8,
                                                             int16_t *d_8x8);
    void                oil_rowsad8x8_u8                    (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             const uint8_t *s2_8x8);
    void                oil_recon8x8_inter2                 (uint8_t *d_8x8,
                                                             int ds,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2,
                                                             const int16_t *s3_8x8);
    void                oil_composite_add_u8                (uint8_t *i_n,
                                                             const uint8_t *s1_n,
                                                             int n);
    void                oil_sad8x8_u8_avg                   (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             const uint8_t *s3_8x8,
                                                             int ss2);

## Description

## Details

### oil_clip_f32 ()

    void                oil_clip_f32                        (float *dest,
                                                             int dstr,
                                                             const float *src,
                                                             int sstr,
                                                             int n,
                                                             const float *s2_1,
                                                             const float *s3_1);

Clips each value in `src` to the range [`s2_1`,`s3_1`] and places the result in `dest`.

`dest` : |
`dstr` : |
`src` : |
`sstr` : |
`n` : |
`s2_1` : |
`s3_1` : |

### oil_clip_f64 ()

    void                oil_clip_f64                        (double *dest,
                                                             int dstr,
                                                             const double *src,
                                                             int sstr,
                                                             int n,
                                                             const double *s2_1,
                                                             const double *s3_1);

Clips each value in `src` to the range [`s2_1`,`s3_1`] and places the result in `dest`.

`dest` : |
`dstr` : |
`src` : |
`sstr` : |
`n` : |
`s2_1` : |
`s3_1` : |

### oil_clip_s16 ()

    void                oil_clip_s16                        (int16_t *dest,
                                                             int dstr,
                                                             const int16_t *src,
                                                             int sstr,
                                                             int n,
                                                             const int16_t *s2_1,
                                                             const int16_t *s3_1);

Clips each value in `src` to the range [`s2_1`,`s3_1`] and places the result in `dest`.

`dest` : |
`dstr` : |
`src` : |
`sstr` : |
`n` : |
`s2_1` : |
`s3_1` : |

### oil_clip_s32 ()

    void                oil_clip_s32                        (int32_t *dest,
                                                             int dstr,
                                                             const int32_t *src,
                                                             int sstr,
                                                             int n,
                                                             const int32_t *s2_1,
                                                             const int32_t *s3_1);

Clips each value in `src` to the range [`s2_1`,`s3_1`] and places the result in `dest`.

`dest` : |
`dstr` : |
`src` : |
`sstr` : |
`n` : |
`s2_1` : |
`s3_1` : |

### oil_clip_s8 ()

    void                oil_clip_s8                         (int8_t *dest,
                                                             int dstr,
                                                             const int8_t *src,
                                                             int sstr,
                                                             int n,
                                                             const int8_t *s2_1,
                                                             const int8_t *s3_1);

Clips each value in `src` to the range [`s2_1`,`s3_1`] and places the result in `dest`.

`dest` : |
`dstr` : |
`src` : |
`sstr` : |
`n` : |
`s2_1` : |
`s3_1` : |

### oil_clip_u16 ()

    void                oil_clip_u16                        (uint16_t *dest,
                                                             int dstr,
                                                             const uint16_t *src,
                                                             int sstr,
                                                             int n,
                                                             const uint16_t *s2_1,
                                                             const uint16_t *s3_1);

Clips each value in `src` to the range [`s2_1`,`s3_1`] and places the result in `dest`.

`dest` : |
`dstr` : |
`src` : |
`sstr` : |
`n` : |
`s2_1` : |
`s3_1` : |

### oil_clip_u32 ()

    void                oil_clip_u32                        (uint32_t *dest,
                                                             int dstr,
                                                             const uint32_t *src,
                                                             int sstr,
                                                             int n,
                                                             const uint32_t *s2_1,
                                                             const uint32_t *s3_1);

Clips each value in `src` to the range [`s2_1`,`s3_1`] and places the result in `dest`.

`dest` : |
`dstr` : |
`src` : |
`sstr` : |
`n` : |
`s2_1` : |
`s3_1` : |

### oil_clip_u8 ()

    void                oil_clip_u8                         (uint8_t *dest,
                                                             int dstr,
                                                             const uint8_t *src,
                                                             int sstr,
                                                             int n,
                                                             const uint8_t *s2_1,
                                                             const uint8_t *s3_1);

Clips each value in `src` to the range [`s2_1`,`s3_1`] and places the result in `dest`.

`dest` : |
`dstr` : |
`src` : |
`sstr` : |
`n` : |
`s2_1` : |
`s3_1` : |

### oil_dequantize8x8_s16 ()

    void                oil_dequantize8x8_s16               (int16_t *d_8x8,
                                                             int dstr,
                                                             const int16_t *s1_8x8,
                                                             int sstr1,
                                                             const int16_t *s2_8x8,
                                                             int sstr2);

Multiplies each element in `s1_8x8` by the corresponding element in `s2_8x8` and places the result in `d_8x8`.

`d_8x8` : |
`dstr` : |
`s1_8x8` : |
`sstr1` : |
`s2_8x8` : |
`sstr2` : |

### oil_diffsquaresum_f64 ()

    void                oil_diffsquaresum_f64               (double *d_1,
                                                             const double *src1,
                                                             int sstr1,
                                                             const double *src2,
                                                             int sstr2,
                                                             int n);

Calculates the sum of squared differences between `src1` and `src2` and places the result in `d_1`.

`d_1` : |
`src1` : |
`sstr1` : |
`src2` : |
`sstr2` : |
`n` : |

### oil_md5 ()

    void                oil_md5                             (uint32_t *i_4,
                                                             const uint32_t *s_16);

Performs an MD5 checksum iteration. The iteration operates on the 64 bytes contained in `s_16`, and changes the hash contained in `i_4`. This only implements a portion of the MD5 algorithm. The full MD5 algorithm requires initializing the hash with a specific value and additional handling of bytes at the end of the stream.

See also the md5 example in the Liboil source code.

FIXME: need a reference here

`i_4` : |
`s_16` : |

### oil_mix_u8 ()

    void                oil_mix_u8                          (uint8_t *dest,
                                                             const uint8_t *src1,
                                                             const uint8_t *src2,
                                                             const uint8_t *src3,
                                                             int n);

Performs the compisiting operation DEST = (SRC2 IN MASK) OVER SRC1, except it is done incorrectly, so this function should not be used.

FIXME: This function is broken.

`dest` : | DEST
`src1` : | SRC1
`src2` : | SRC2
`src3` : | MASK
`n` : |

### oil_null ()

    void                oil_null                            (void);

Does nothing, and does it fast.

This function is useful for testing the overhead of calling a Liboil function.

### oil_scanlinescale2_u8 ()

    void                oil_scanlinescale2_u8               (uint8_t *d,
                                                             const uint8_t *s,
                                                             int n);

Upsamples the source array by a factor of two. That is, if the values in `s` are A,B,C,D,E, the values written to `d` are A,A,B,B,C,C,D,D,E,E. Note that `n` is the number of elements written to `d`, and that half of `s` is not used.

`d` : | destination array
`s` : | source array
`n` : | number of elements

### oil_sincos_f64 ()

    void                oil_sincos_f64                      (double *dest1,
                                                             double *dest2,
                                                             int n,
                                                             const double *s1_1,
                                                             const double *s2_1);

Calculates sin(x) and cos(x) and places the results in `dest1` and `dest2` respectively. Values for x start at `s1_1` and are incremented by `s2_1` for each destination element.

`dest1` : |
`dest2` : |
`n` : |
`s1_1` : |
`s2_1` : |

### oil_utf8_validate ()

    void                oil_utf8_validate                   (int32_t *d_1,
                                                             const uint8_t *s,
                                                             int n);

Checks `s` for valid UTF-8 characters. If the entire `s` array represents valid UTF-8 characters, `n` is written to `d_1`. Otherwise, the index in the array of the beginning of the first invalid UTF-8 character is written to `d_1`.

`d_1` : |
`s` : |
`n` : |

### oil_diff8x8_s16_u8 ()

    void                oil_diff8x8_s16_u8                  (int16_t *d_8x8,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2);

Calculates the difference of each value in `s1_8x8` and `s2_8x8` and places the result in `d_8x8`. Note that the destination type is larger than the source type.

`d_8x8` : |
`s1_8x8` : |
`ss1` : |
`s2_8x8` : |
`ss2` : |

### oil_diff8x8_average_s16_u8 ()

    void                oil_diff8x8_average_s16_u8          (int16_t *d_8x8,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2,
                                                             const uint8_t *s3_8x8,
                                                             int ss3);

Calculates the difference of each value in `s1_8x8` and the average of `s2_8x8` and `s3_8x8`, and places the result in `d_8x8`. Note that the destination type is larger than the source type.

`d_8x8` : |
`s1_8x8` : |
`ss1` : |
`s2_8x8` : |
`ss2` : |
`s3_8x8` : |
`ss3` : |

### oil_err_inter8x8_u8_avg ()

    void                oil_err_inter8x8_u8_avg             (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             const uint8_t *s3_8x8,
                                                             int ss2);

Calculates an intermediate 8x8 block where each element is the difference between `s1_8x8` and the average of `s2_8x8` and `s3_8x8`. The sum of squares of the difference of each element in the intermediate block and the mean of the intermediate block is placed into `d_1`. This result is 64 times the variance of the mean of the intermediate block.

FIXME: This function is broken, since the reference function uses `ss2` as the stride for both `s2_8x8` and `s3_8x8`.

`d_1` : |
`s1_8x8` : |
`ss1` : |
`s2_8x8` : |
`s3_8x8` : |
`ss2` : |

### oil_recon8x8_inter ()

    void                oil_recon8x8_inter                  (uint8_t *d_8x8,
                                                             int ds,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const int16_t *s2_8x8);

Adds each element in `s1_8x8` and `s2_8x8`, clamps to the range [0,255], and places the result in the destination array.

`d_8x8` : |
`ds` : |
`s1_8x8` : |
`ss1` : |
`s2_8x8` : |

### oil_err_intra8x8_u8 ()

    void                oil_err_intra8x8_u8                 (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1);

Calculates the sum of squared differences from the mean over `s1_8x8` and places the result in `d_1`. This result is 64 times the variance of the mean of `s1_8x8`.

`d_1` : |
`s1_8x8` : |
`ss1` : |

### oil_recon8x8_intra ()

    void                oil_recon8x8_intra                  (uint8_t *d_8x8,
                                                             int ds,
                                                             const int16_t *s_8x8);

Adds 128 to each value in the source array, clamps to the range [0,255], and places the result in the destination array.

`d_8x8` : |
`ds` : |
`s_8x8` : |

### oil_colsad8x8_u8 ()

    void                oil_colsad8x8_u8                    (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2);

Divides the 8x8 block into 16 1x4 regions, and calculates the sum of absolute differences between `s1_8x8` and `s2_8x8` for each region. The maximum of the results in each region is placed in `d_1`.

`d_1` : |
`s1_8x8` : |
`ss1` : |
`s2_8x8` : |
`ss2` : |

### oil_composite_over_u8 ()

    void                oil_composite_over_u8               (uint8_t *i_n,
                                                             const uint8_t *s1_n,
                                                             int n);

Performs the compositing operation DEST = SRC OVER DEST.

`i_n` : | DEST
`s1_n` : | SRC
`n` : | number of elements

### oil_diff8x8_const128_s16_u8 ()

    void                oil_diff8x8_const128_s16_u8         (int16_t *d_8x8,
                                                             const uint8_t *s1_8x8,
                                                             int ss1);

Subtracts 128 from each value in `s1_8x8` and places the result in `d_8x8`. Note that the destination type is larger than the source type.

`d_8x8` : |
`s1_8x8` : |
`ss1` : |

### oil_copy8x8_u8 ()

    void                oil_copy8x8_u8                      (uint8_t *d_8x8,
                                                             int ds,
                                                             const uint8_t *s_8x8,
                                                             int ss);

Copies an 8x8 block.

`d_8x8` : |
`ds` : |
`s_8x8` : |
`ss` : |

### oil_err_inter8x8_u8 ()

    void                oil_err_inter8x8_u8                 (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2);

Calculates an intermediate 8x8 block where each element is the difference between `s1_8x8` and `s2_8x8`. The sum of squares of the difference of each element in the intermediate block and the mean of the intermediate block is placed into `d_1`. This result is equal to 64 times the variance of the mean of the intermediate block.

`d_1` : |
`s1_8x8` : |
`ss1` : |
`s2_8x8` : |
`ss2` : |

### oil_fdct8x8theora ()

    void                oil_fdct8x8theora                   (const int16_t *s_8x8,
                                                             int16_t *d_8x8);

Calculates the FDCT transformation of `s_8x8` according to the Theora specification and places the result in `d_8x8`.

Note that the source and destination arrays are reversed compared to normal Liboil order.

`s_8x8` : |
`d_8x8` : |

### oil_rowsad8x8_u8 ()

    void                oil_rowsad8x8_u8                    (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             const uint8_t *s2_8x8);

Calculates the sum of absolute differences between `s1_8x8` and `s1_8s8` for the first 4 elements of the first row, and the sum of absolute differences for the last 4 elements of the first row, and places the maximum of those values in `dest`.

FIXME: This function is declared incorrectly.

`d_1` : |
`s1_8x8` : |
`s2_8x8` : |

### oil_recon8x8_inter2 ()

    void                oil_recon8x8_inter2                 (uint8_t *d_8x8,
                                                             int ds,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             int ss2,
                                                             const int16_t *s3_8x8);

Adds each element in `s1_8x8` and `s2_8x8`, divides by 2, and adds to `s3_8x8`, clamps to the range [0,255], and places the result in the destination array.

`d_8x8` : |
`ds` : |
`s1_8x8` : |
`ss1` : |
`s2_8x8` : |
`ss2` : |
`s3_8x8` : |

### oil_composite_add_u8 ()

    void                oil_composite_add_u8                (uint8_t *i_n,
                                                             const uint8_t *s1_n,
                                                             int n);

Performs the compositing operation DEST = SRC ADD DEST.

`i_n` : | DEST
`s1_n` : | SRC
`n` : | number of elements

### oil_sad8x8_u8_avg ()

    void                oil_sad8x8_u8_avg                   (uint32_t *d_1,
                                                             const uint8_t *s1_8x8,
                                                             int ss1,
                                                             const uint8_t *s2_8x8,
                                                             const uint8_t *s3_8x8,
                                                             int ss2);

Calculates the sum of absolute differences between `s1_8x8` and the average of `s2_8x8` and `s3_8x8`.

FIXME: This function is broken because the reference function assumes the stride for `s3_8x8` is `ss2`.

`d_1` : |
`s1_8x8` : |
`ss1` : |
`s2_8x8` : |
`s3_8x8` : |
`ss2` : |