summaryrefslogtreecommitdiffstats
path: root/libmpcodecs/pullup.c
diff options
context:
space:
mode:
authorrfelker <rfelker@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-08-31 17:46:32 +0000
committerrfelker <rfelker@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-08-31 17:46:32 +0000
commitcfa265212a083a5ad7a9cfad4a2488545c2122fd (patch)
treea636e91660355f9001b878eb34d685adc9a2c33a /libmpcodecs/pullup.c
parent8a06bf7da79d211cd9db8a08a473fab9cf39d2a4 (diff)
downloadmpv-cfa265212a083a5ad7a9cfad4a2488545c2122fd.tar.bz2
mpv-cfa265212a083a5ad7a9cfad4a2488545c2122fd.tar.xz
fix 10l (computation based on uninitialized data which led to
incorrect field matching) and greatly improve selection logic. the pullup core should be very accurate now, so try throwing tough samples at it and report any failures! :) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10731 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs/pullup.c')
-rw-r--r--libmpcodecs/pullup.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/libmpcodecs/pullup.c b/libmpcodecs/pullup.c
index 3963db2c1f..0bfb854c78 100644
--- a/libmpcodecs/pullup.c
+++ b/libmpcodecs/pullup.c
@@ -321,7 +321,7 @@ static void compute_breaks(struct pullup_context *c, struct pullup_field *f0)
if (-l > max_r) max_r = -l;
}
/* Don't get tripped up when differences are mostly quant error */
- if (max_l + max_r < 64) return;
+ if (max_l + max_r < 256) return;
if (max_l > 4*max_r) f1->breaks |= BREAK_LEFT;
if (max_r > 4*max_l) f2->breaks |= BREAK_RIGHT;
//printf("max_l=%d max_r=%d\n", max_l, max_r);
@@ -330,7 +330,7 @@ static void compute_breaks(struct pullup_context *c, struct pullup_field *f0)
static void compute_affinity(struct pullup_context *c, struct pullup_field *f)
{
int i;
- int max_l=0, max_r=0, l;
+ int max_l=0, max_r=0, l, t;
if (f->flags & F_HAVE_AFFINITY) return;
f->flags |= F_HAVE_AFFINITY;
for (i = 0; i < c->metric_len; i++) {
@@ -338,16 +338,25 @@ static void compute_affinity(struct pullup_context *c, struct pullup_field *f)
if (l > max_l) max_l = l;
if (-l > max_r) max_r = -l;
}
- if (max_l + max_r < 64) return;
+ if (max_l + max_r < 256) return;
if (max_r > 3*max_l) f->affinity = -1;
else if (max_l > 3*max_r) f->affinity = 1;
+ else if (max_l + max_r > 2048) {
+ for (i = 0; i < c->metric_len; i++) {
+ l += f->licomb[i] - f->next->licomb[i];
+ t += ABS(f->licomb[i] - f->next->licomb[i]);
+ }
+ if (-l*4 > t) f->affinity = -1;
+ else if (l*4 > t) f->affinity = 1;
+ //printf("affinity from avg: %d\n", f->affinity);
+ }
}
static void foo(struct pullup_context *c)
{
struct pullup_field *f = c->first;
int i, n = queue_length(f, c->last);
- for (i = 0; i < n; i++) {
+ for (i = 0; i < n-1; i++) {
if (i < n-3) compute_breaks(c, f);
compute_affinity(c, f);
f = f->next;
@@ -369,19 +378,24 @@ static int decide_frame_length(struct pullup_context *c)
n = find_first_break(f0, 3);
+ if (f0->affinity == -1) return 1;
+
switch (n) {
case 1:
return 1;
case 2:
- if (f0->affinity == -1 || f1->affinity == 1) return 1;
+ if (f1->affinity == 1) return 1;
else return 2;
case 3:
- if (f1->affinity == -1 && f2->affinity != -1) return 2;
- else if (f1->affinity == 1 && f0->affinity != 1) return 1;
+ if (f1->affinity == -1) return 2;
+ else if (f1->affinity == 1) return 1;
else return 3;
default:
- if (f0->affinity == -1 && f1->affinity != -1) return 1;
- else if (f1->affinity == 1 && f2->affinity == -1) return 1;
+ if (f1->affinity == 1) return 1;
+ else if (f1->affinity == -1) return 2;
+ else if (f2->affinity == 1) return 2;
+ else if (f0->affinity == 1 && f2->affinity == -1) return 3;
+ else if (f2->affinity == 0 && f3->affinity == 1) return 3;
else return 2;
}
}