Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/videolan/dav1d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/cdf.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2018-12-09 17:52:09 +0300
committerRonald S. Bultje <rsbultje@gmail.com>2018-12-10 00:26:43 +0300
commit0f7a97ba909929bf312f1c9df3e5fc411479981c (patch)
treea27471b11c8af5ae5acdf27b4537602c9ceb16e8 /src/cdf.c
parent6bc4acf43c3f76fec817b5fb4e3b4ada4ae41ad6 (diff)
Make static CDF tables source directly from rodata
Fixes #57, removes one rodata duplicate (vertical mv component is identical to horizontal one), and removes memcpy() of rodata tables to the source Dav1dThreadCdfContext for each frame where primary_ref is PRIMARY_REF_NONE.
Diffstat (limited to 'src/cdf.c')
-rw-r--r--src/cdf.c171
1 files changed, 68 insertions, 103 deletions
diff --git a/src/cdf.c b/src/cdf.c
index 54881b2..4987354 100644
--- a/src/cdf.c
+++ b/src/cdf.c
@@ -777,72 +777,42 @@ static const CdfModeContext av1_default_cdf = {
},
};
-static const CdfMvContext default_mv_cdf = {
- .comp = {
- { /* mv vertical component */
- .classes = {
- AOM_CDF11(28672, 30976, 31858, 32320, 32551, 32656, 32740,
- 32757, 32762, 32767)
- }, .class0 = {
- AOM_CDF2(216 * 128)
- }, .classN = {
- { AOM_CDF2(128 * 136) },
- { AOM_CDF2(128 * 140) },
- { AOM_CDF2(128 * 148) },
- { AOM_CDF2(128 * 160) },
- { AOM_CDF2(128 * 176) },
- { AOM_CDF2(128 * 192) },
- { AOM_CDF2(128 * 224) },
- { AOM_CDF2(128 * 234) },
- { AOM_CDF2(128 * 234) },
- { AOM_CDF2(128 * 240) }
- }, .class0_fp = {
- { AOM_CDF4(16384, 24576, 26624) },
- { AOM_CDF4(12288, 21248, 24128) }
- }, .classN_fp = {
- AOM_CDF4(8192, 17408, 21248)
- }, .class0_hp = {
- AOM_CDF2(160 * 128)
- }, .classN_hp = {
- AOM_CDF2(128 * 128)
- }, .sign = {
- AOM_CDF2(128 * 128)
- }
- }, { /* mv horizontal component */
- .classes = {
- AOM_CDF11(28672, 30976, 31858, 32320, 32551, 32656, 32740,
- 32757, 32762, 32767)
- }, .class0 = {
- AOM_CDF2(216 * 128)
- }, .classN = {
- { AOM_CDF2(128 * 136) },
- { AOM_CDF2(128 * 140) },
- { AOM_CDF2(128 * 148) },
- { AOM_CDF2(128 * 160) },
- { AOM_CDF2(128 * 176) },
- { AOM_CDF2(128 * 192) },
- { AOM_CDF2(128 * 224) },
- { AOM_CDF2(128 * 234) },
- { AOM_CDF2(128 * 234) },
- { AOM_CDF2(128 * 240) }
- }, .class0_fp = {
- { AOM_CDF4(16384, 24576, 26624) },
- { AOM_CDF4(12288, 21248, 24128) }
- }, .classN_fp = {
- AOM_CDF4(8192, 17408, 21248)
- }, .class0_hp = {
- AOM_CDF2(160 * 128)
- }, .classN_hp = {
- AOM_CDF2(128 * 128)
- }, .sign = {
- AOM_CDF2(128 * 128)
- },
- }
- }, .joint = {
- AOM_CDF4(4096, 11264, 19328)
+static const CdfMvComponent default_mv_component_cdf = {
+ .classes = {
+ AOM_CDF11(28672, 30976, 31858, 32320, 32551, 32656, 32740,
+ 32757, 32762, 32767)
+ }, .class0 = {
+ AOM_CDF2(216 * 128)
+ }, .classN = {
+ { AOM_CDF2(128 * 136) },
+ { AOM_CDF2(128 * 140) },
+ { AOM_CDF2(128 * 148) },
+ { AOM_CDF2(128 * 160) },
+ { AOM_CDF2(128 * 176) },
+ { AOM_CDF2(128 * 192) },
+ { AOM_CDF2(128 * 224) },
+ { AOM_CDF2(128 * 234) },
+ { AOM_CDF2(128 * 234) },
+ { AOM_CDF2(128 * 240) }
+ }, .class0_fp = {
+ { AOM_CDF4(16384, 24576, 26624) },
+ { AOM_CDF4(12288, 21248, 24128) }
+ }, .classN_fp = {
+ AOM_CDF4(8192, 17408, 21248)
+ }, .class0_hp = {
+ AOM_CDF2(160 * 128)
+ }, .classN_hp = {
+ AOM_CDF2(128 * 128)
+ }, .sign = {
+ AOM_CDF2(128 * 128)
}
};
+
+static const uint16_t default_mv_joint_cdf[N_MV_JOINTS + 1] = {
+ AOM_CDF4(4096, 11264, 19328)
+};
+
static const uint16_t default_kf_y_mode_cdf[5][5][N_INTRA_PRED_MODES + 1] = {
{
{ AOM_CDF13(15588, 17027, 19338, 20218, 20682, 21110, 21825, 23244,
@@ -4041,42 +4011,9 @@ static const CdfCoefContext av1_default_coef_cdf[4] = {
}
};
-static inline int get_qcat_idx(int q) {
- if (q <= 20) return 0;
- if (q <= 60) return 1;
- if (q <= 120) return 2;
- return 3;
-}
-
-static CdfThreadContext cdf_init[4] = {
- [0] = { .cdf = NULL },
- [1] = { .cdf = NULL },
- [2] = { .cdf = NULL },
- [3] = { .cdf = NULL },
-};
-
-int dav1d_init_states(CdfThreadContext *const cdf, const int qidx) {
- const int qcat = get_qcat_idx(qidx);
- if (cdf_init[qcat].cdf) {
- dav1d_cdf_thread_ref(cdf, &cdf_init[qcat]);
- return 0;
- }
-
- int res = dav1d_cdf_thread_alloc(&cdf_init[qcat], NULL);
- if (res < 0) return res;
- cdf_init[qcat].cdf->m = av1_default_cdf;
- memcpy(cdf_init[qcat].cdf->kfym, default_kf_y_mode_cdf,
- sizeof(default_kf_y_mode_cdf));
- cdf_init[qcat].cdf->coef = av1_default_coef_cdf[qcat];
- cdf_init[qcat].cdf->mv = default_mv_cdf;
- cdf_init[qcat].cdf->dmv = default_mv_cdf;
- dav1d_cdf_thread_ref(cdf, &cdf_init[qcat]);
- return 0;
-}
-
-void dav1d_update_tile_cdf(const Dav1dFrameHeader *const hdr,
- CdfContext *const dst,
- const CdfContext *const src)
+void dav1d_cdf_thread_update(const Dav1dFrameHeader *const hdr,
+ CdfContext *const dst,
+ const CdfContext *const src)
{
int i, j, k, l;
@@ -4213,15 +4150,41 @@ void dav1d_update_tile_cdf(const Dav1dFrameHeader *const hdr,
/*
* CDF threading wrappers.
*/
+static inline int get_qcat_idx(int q) {
+ if (q <= 20) return 0;
+ if (q <= 60) return 1;
+ if (q <= 120) return 2;
+ return 3;
+}
+
+void dav1d_cdf_thread_init_static(CdfThreadContext *const cdf, const int qidx) {
+ cdf->ref = NULL;
+ cdf->data.qcat = get_qcat_idx(qidx);
+}
+
+void dav1d_cdf_thread_copy(CdfContext *const dst, const CdfThreadContext *const src) {
+ if (src->ref) {
+ memcpy(dst, src->data.cdf, sizeof(*dst));
+ } else {
+ dst->m = av1_default_cdf;
+ memcpy(dst->kfym, default_kf_y_mode_cdf, sizeof(default_kf_y_mode_cdf));
+ dst->coef = av1_default_coef_cdf[src->data.qcat];
+ memcpy(dst->mv.joint, default_mv_joint_cdf, sizeof(default_mv_joint_cdf));
+ memcpy(dst->dmv.joint, default_mv_joint_cdf, sizeof(default_mv_joint_cdf));
+ dst->mv.comp[0] = dst->mv.comp[1] = dst->dmv.comp[0] = dst->dmv.comp[1] =
+ default_mv_component_cdf;
+ }
+}
+
int dav1d_cdf_thread_alloc(CdfThreadContext *const cdf,
struct thread_data *const t)
{
cdf->ref = dav1d_ref_create(sizeof(CdfContext) +
(t != NULL) * sizeof(atomic_uint));
if (!cdf->ref) return -ENOMEM;
- cdf->cdf = cdf->ref->data;
+ cdf->data.cdf = cdf->ref->data;
if (t) {
- cdf->progress = (atomic_uint *) &cdf->cdf[1];
+ cdf->progress = (atomic_uint *) &cdf->data.cdf[1];
atomic_init(cdf->progress, 0);
cdf->t = t;
}
@@ -4231,13 +4194,15 @@ int dav1d_cdf_thread_alloc(CdfThreadContext *const cdf,
void dav1d_cdf_thread_ref(CdfThreadContext *const dst,
CdfThreadContext *const src)
{
- dav1d_ref_inc(src->ref);
*dst = *src;
+ if (src->ref)
+ dav1d_ref_inc(src->ref);
}
void dav1d_cdf_thread_unref(CdfThreadContext *const cdf) {
- dav1d_ref_dec(&cdf->ref);
memset(cdf, 0, sizeof(*cdf));
+ if (cdf->ref)
+ dav1d_ref_dec(&cdf->ref);
}
void dav1d_cdf_thread_wait(CdfThreadContext *const cdf) {