1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include "config.h" 20cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 21cabdff1aSopenharmony_ci#include "huffyuvencdsp.h" 22cabdff1aSopenharmony_ci#include "mathops.h" 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci// 0x00010001 or 0x0001000100010001 or whatever, depending on the cpu's native arithmetic size 25cabdff1aSopenharmony_ci#define pw_1 (ULONG_MAX / UINT16_MAX) 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_cistatic void diff_int16_c(uint16_t *dst, const uint16_t *src1, const uint16_t *src2, unsigned mask, int w){ 28cabdff1aSopenharmony_ci long i; 29cabdff1aSopenharmony_ci#if !HAVE_FAST_UNALIGNED 30cabdff1aSopenharmony_ci if((long)src2 & (sizeof(long)-1)){ 31cabdff1aSopenharmony_ci for(i=0; i+3<w; i+=4){ 32cabdff1aSopenharmony_ci dst[i+0] = (src1[i+0]-src2[i+0]) & mask; 33cabdff1aSopenharmony_ci dst[i+1] = (src1[i+1]-src2[i+1]) & mask; 34cabdff1aSopenharmony_ci dst[i+2] = (src1[i+2]-src2[i+2]) & mask; 35cabdff1aSopenharmony_ci dst[i+3] = (src1[i+3]-src2[i+3]) & mask; 36cabdff1aSopenharmony_ci } 37cabdff1aSopenharmony_ci }else 38cabdff1aSopenharmony_ci#endif 39cabdff1aSopenharmony_ci { 40cabdff1aSopenharmony_ci unsigned long pw_lsb = (mask >> 1) * pw_1; 41cabdff1aSopenharmony_ci unsigned long pw_msb = pw_lsb + pw_1; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci for (i = 0; i <= w - (int)sizeof(long)/2; i += sizeof(long)/2) { 44cabdff1aSopenharmony_ci long a = *(long*)(src1+i); 45cabdff1aSopenharmony_ci long b = *(long*)(src2+i); 46cabdff1aSopenharmony_ci *(long*)(dst+i) = ((a|pw_msb) - (b&pw_lsb)) ^ ((a^b^pw_msb)&pw_msb); 47cabdff1aSopenharmony_ci } 48cabdff1aSopenharmony_ci } 49cabdff1aSopenharmony_ci for (; i<w; i++) 50cabdff1aSopenharmony_ci dst[i] = (src1[i] - src2[i]) & mask; 51cabdff1aSopenharmony_ci} 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_cistatic void sub_hfyu_median_pred_int16_c(uint16_t *dst, const uint16_t *src1, const uint16_t *src2, unsigned mask, int w, int *left, int *left_top){ 54cabdff1aSopenharmony_ci int i; 55cabdff1aSopenharmony_ci uint16_t l, lt; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci l = *left; 58cabdff1aSopenharmony_ci lt = *left_top; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci for(i=0; i<w; i++){ 61cabdff1aSopenharmony_ci const int pred = mid_pred(l, src1[i], (l + src1[i] - lt) & mask); 62cabdff1aSopenharmony_ci lt = src1[i]; 63cabdff1aSopenharmony_ci l = src2[i]; 64cabdff1aSopenharmony_ci dst[i] = (l - pred) & mask; 65cabdff1aSopenharmony_ci } 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci *left = l; 68cabdff1aSopenharmony_ci *left_top = lt; 69cabdff1aSopenharmony_ci} 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ciav_cold void ff_huffyuvencdsp_init(HuffYUVEncDSPContext *c, AVCodecContext *avctx) 72cabdff1aSopenharmony_ci{ 73cabdff1aSopenharmony_ci c->diff_int16 = diff_int16_c; 74cabdff1aSopenharmony_ci c->sub_hfyu_median_pred_int16 = sub_hfyu_median_pred_int16_c; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci#if ARCH_X86 77cabdff1aSopenharmony_ci ff_huffyuvencdsp_init_x86(c, avctx); 78cabdff1aSopenharmony_ci#endif 79cabdff1aSopenharmony_ci} 80