summaryrefslogtreecommitdiff
path: root/libavcodec/ffv1_template.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2016-08-07 23:37:17 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2016-08-08 00:27:43 +0200
commit74314f1f5f9ef69700eb18b85a8260e2754a31ef (patch)
tree097e9b61add9b11061b63f17dea74c21d8061ff5 /libavcodec/ffv1_template.c
parent22d13e4290c8fdba57485e1b501f6a92283a10db (diff)
downloadffmpeg-74314f1f5f9ef69700eb18b85a8260e2754a31ef.tar.gz
avcodec/ffv1: template functions to allow data types different from int16_t
This is required for >= 16bit RGB support I tried it without templates but its too much duplicated code Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/ffv1_template.c')
-rw-r--r--libavcodec/ffv1_template.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/libavcodec/ffv1_template.c b/libavcodec/ffv1_template.c
new file mode 100644
index 0000000000..f2ab93313a
--- /dev/null
+++ b/libavcodec/ffv1_template.c
@@ -0,0 +1,53 @@
+/*
+ * FFV1 codec
+ *
+ * Copyright (c) 2003-2013 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static inline int RENAME(predict)(TYPE *src, TYPE *last)
+{
+ const int LT = last[-1];
+ const int T = last[0];
+ const int L = src[-1];
+
+ return mid_pred(L, L + T - LT, T);
+}
+
+static inline int RENAME(get_context)(PlaneContext *p, TYPE *src,
+ TYPE *last, TYPE *last2)
+{
+ const int LT = last[-1];
+ const int T = last[0];
+ const int RT = last[1];
+ const int L = src[-1];
+
+ if (p->quant_table[3][127]) {
+ const int TT = last2[0];
+ const int LL = src[-2];
+ return p->quant_table[0][(L - LT) & 0xFF] +
+ p->quant_table[1][(LT - T) & 0xFF] +
+ p->quant_table[2][(T - RT) & 0xFF] +
+ p->quant_table[3][(LL - L) & 0xFF] +
+ p->quant_table[4][(TT - T) & 0xFF];
+ } else
+ return p->quant_table[0][(L - LT) & 0xFF] +
+ p->quant_table[1][(LT - T) & 0xFF] +
+ p->quant_table[2][(T - RT) & 0xFF];
+}
+