annotate libmpcodecs/vf_pullup.c @ 24970:938e685a263c

ack, can't believe i wrote this crap with void pointer arithmetic gimme some cola!!! since the code was disabled and tests had shown it was slower, i'm just removing it rather than fixing it.
author rfelker
date Fri, 09 Nov 2007 12:51:43 +0000
parents 4d4c5efcfdb0
children 8bbc042f23c4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
1 #include <stdio.h>
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
2 #include <stdlib.h>
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
3 #include <string.h>
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
4
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15037
diff changeset
5 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15037
diff changeset
6 #include "mp_msg.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15037
diff changeset
7 #include "cpudetect.h"
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
8
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
9 #include "img_format.h"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
10 #include "mp_image.h"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
11 #include "vf.h"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
12
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15037
diff changeset
13 #include "libvo/fastmemcpy.h"
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
14
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
15 #include "pullup.h"
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
16
12548
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
17 #undef MAX
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
18 #define MAX(a,b) ((a)>(b)?(a):(b))
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
19
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
20 struct vf_priv_s {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
21 struct pullup_context *ctx;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
22 int init;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
23 int fakecount;
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
24 char *qbuf;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
25 };
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
26
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
27 static void init_pullup(struct vf_instance_s* vf, mp_image_t *mpi)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
28 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
29 struct pullup_context *c = vf->priv->ctx;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
30
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
31 if (mpi->flags & MP_IMGFLAG_PLANAR) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
32 c->format = PULLUP_FMT_Y;
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
33 c->nplanes = 4;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
34 pullup_preinit_context(c);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
35 c->bpp[0] = c->bpp[1] = c->bpp[2] = 8;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
36 c->w[0] = mpi->w;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
37 c->h[0] = mpi->h;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
38 c->w[1] = c->w[2] = mpi->chroma_width;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
39 c->h[1] = c->h[2] = mpi->chroma_height;
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
40 c->w[3] = ((mpi->w+15)/16) * ((mpi->h+15)/16);
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
41 c->h[3] = 2;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
42 c->stride[0] = mpi->width;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
43 c->stride[1] = c->stride[2] = mpi->chroma_width;
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
44 c->stride[3] = c->w[3];
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
45 c->background[1] = c->background[2] = 128;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
46 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
47
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
48 if (gCpuCaps.hasMMX) c->cpu |= PULLUP_CPU_MMX;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
49 if (gCpuCaps.hasMMX2) c->cpu |= PULLUP_CPU_MMX2;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
50 if (gCpuCaps.has3DNow) c->cpu |= PULLUP_CPU_3DNOW;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
51 if (gCpuCaps.has3DNowExt) c->cpu |= PULLUP_CPU_3DNOWEXT;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
52 if (gCpuCaps.hasSSE) c->cpu |= PULLUP_CPU_SSE;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
53 if (gCpuCaps.hasSSE2) c->cpu |= PULLUP_CPU_SSE2;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
54
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
55 pullup_init_context(c);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
56
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
57 vf->priv->init = 1;
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
58 vf->priv->qbuf = malloc(c->w[3]);
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
59 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
60
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
61
24603
4d4c5efcfdb0 Disable buggy unused function via #if 0, blessed by Rich.
diego
parents: 23666
diff changeset
62 #if 0
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
63 static void get_image(struct vf_instance_s* vf, mp_image_t *mpi)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
64 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
65 struct pullup_context *c = vf->priv->ctx;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
66 struct pullup_buffer *b;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
67
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
68 if (mpi->type == MP_IMGTYPE_STATIC) return;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
69
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
70 if (!vf->priv->init) init_pullup(vf, mpi);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
71
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
72 b = pullup_get_buffer(c, 2);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
73 if (!b) return; /* shouldn't happen... */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
74
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
75 mpi->priv = b;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
76
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
77 mpi->planes[0] = b->planes[0];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
78 mpi->planes[1] = b->planes[1];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
79 mpi->planes[2] = b->planes[2];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
80 mpi->stride[0] = c->stride[0];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
81 mpi->stride[1] = c->stride[1];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
82 mpi->stride[2] = c->stride[2];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
83
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
84 mpi->flags |= MP_IMGFLAG_DIRECT;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
85 mpi->flags &= ~MP_IMGFLAG_DRAW_CALLBACK;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
86 }
24603
4d4c5efcfdb0 Disable buggy unused function via #if 0, blessed by Rich.
diego
parents: 23666
diff changeset
87 #endif
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
88
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
89 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts)
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
90 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
91 struct pullup_context *c = vf->priv->ctx;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
92 struct pullup_buffer *b;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
93 struct pullup_frame *f;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
94 mp_image_t *dmpi;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
95 int ret;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
96 int p;
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
97 int i;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
98
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
99 if (!vf->priv->init) init_pullup(vf, mpi);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
100
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
101 if (mpi->flags & MP_IMGFLAG_DIRECT) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
102 b = mpi->priv;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
103 mpi->priv = 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
104 } else {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
105 b = pullup_get_buffer(c, 2);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
106 if (!b) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
107 mp_msg(MSGT_VFILTER,MSGL_ERR,"Could not get buffer from pullup!\n");
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
108 f = pullup_get_frame(c);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
109 pullup_release_frame(f);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
110 return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
111 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
112 memcpy_pic(b->planes[0], mpi->planes[0], mpi->w, mpi->h,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
113 c->stride[0], mpi->stride[0]);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
114 if (mpi->flags & MP_IMGFLAG_PLANAR) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
115 memcpy_pic(b->planes[1], mpi->planes[1],
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
116 mpi->chroma_width, mpi->chroma_height,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
117 c->stride[1], mpi->stride[1]);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
118 memcpy_pic(b->planes[2], mpi->planes[2],
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
119 mpi->chroma_width, mpi->chroma_height,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
120 c->stride[2], mpi->stride[2]);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
121 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
122 }
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
123 if (mpi->qscale) {
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 17906
diff changeset
124 fast_memcpy(b->planes[3], mpi->qscale, c->w[3]);
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 17906
diff changeset
125 fast_memcpy(b->planes[3]+c->w[3], mpi->qscale, c->w[3]);
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
126 }
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
127
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
128 p = mpi->fields & MP_IMGFIELD_TOP_FIRST ? 0 :
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
129 (mpi->fields & MP_IMGFIELD_ORDERED ? 1 : 0);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
130 pullup_submit_field(c, b, p);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
131 pullup_submit_field(c, b, p^1);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
132 if (mpi->fields & MP_IMGFIELD_REPEAT_FIRST)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
133 pullup_submit_field(c, b, p);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
134
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
135 pullup_release_buffer(b, 2);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
136
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
137 f = pullup_get_frame(c);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
138
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
139 /* Fake yes for first few frames (buffer depth) to keep from
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
140 * breaking A/V sync with G1's bad architecture... */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
141 if (!f) return vf->priv->fakecount ? (--vf->priv->fakecount,1) : 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
142
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
143 if (f->length < 2) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
144 pullup_release_frame(f);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
145 f = pullup_get_frame(c);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
146 if (!f) return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
147 if (f->length < 2) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
148 pullup_release_frame(f);
14954
fe1dfcfcc3bf 1000l to me: could break a/v sync and eventually cause buffer exhaustion on soft-telecined input that's ugly
rfelker
parents: 13267
diff changeset
149 if (!(mpi->fields & MP_IMGFIELD_REPEAT_FIRST))
fe1dfcfcc3bf 1000l to me: could break a/v sync and eventually cause buffer exhaustion on soft-telecined input that's ugly
rfelker
parents: 13267
diff changeset
150 return 0;
fe1dfcfcc3bf 1000l to me: could break a/v sync and eventually cause buffer exhaustion on soft-telecined input that's ugly
rfelker
parents: 13267
diff changeset
151 f = pullup_get_frame(c);
fe1dfcfcc3bf 1000l to me: could break a/v sync and eventually cause buffer exhaustion on soft-telecined input that's ugly
rfelker
parents: 13267
diff changeset
152 if (!f) return 0;
fe1dfcfcc3bf 1000l to me: could break a/v sync and eventually cause buffer exhaustion on soft-telecined input that's ugly
rfelker
parents: 13267
diff changeset
153 if (f->length < 2) {
fe1dfcfcc3bf 1000l to me: could break a/v sync and eventually cause buffer exhaustion on soft-telecined input that's ugly
rfelker
parents: 13267
diff changeset
154 pullup_release_frame(f);
fe1dfcfcc3bf 1000l to me: could break a/v sync and eventually cause buffer exhaustion on soft-telecined input that's ugly
rfelker
parents: 13267
diff changeset
155 return 0;
fe1dfcfcc3bf 1000l to me: could break a/v sync and eventually cause buffer exhaustion on soft-telecined input that's ugly
rfelker
parents: 13267
diff changeset
156 }
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
157 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
158 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
159
12548
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
160 #if 0
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
161 /* Average qscale tables from both frames. */
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
162 if (mpi->qscale) {
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
163 for (i=0; i<c->w[3]; i++) {
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
164 vf->priv->qbuf[i] = (f->ofields[0]->planes[3][i]
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
165 + f->ofields[1]->planes[3][i+c->w[3]])>>1;
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
166 }
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
167 }
12548
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
168 #else
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
169 /* Take worst of qscale tables from both frames. */
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
170 if (mpi->qscale) {
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
171 for (i=0; i<c->w[3]; i++) {
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
172 vf->priv->qbuf[i] = MAX(f->ofields[0]->planes[3][i], f->ofields[1]->planes[3][i+c->w[3]]);
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
173 }
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
174 }
8584fdad0188 old changes in my local tree i forgot to commit - minor fixes
rfelker
parents: 11629
diff changeset
175 #endif
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
176
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
177 /* If the frame isn't already exportable... */
10773
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
178 while (!f->buffer) {
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
179 dmpi = vf_get_image(vf->next, mpi->imgfmt,
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
180 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
181 mpi->width, mpi->height);
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
182 /* FIXME: Is it ok to discard dmpi if it's not direct? */
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
183 if (!(dmpi->flags & MP_IMGFLAG_DIRECT)) {
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
184 pullup_pack_frame(c, f);
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
185 break;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
186 }
10773
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
187 /* Direct render fields into output buffer */
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 10956
diff changeset
188 my_memcpy_pic(dmpi->planes[0], f->ofields[0]->planes[0],
10773
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
189 mpi->w, mpi->h/2, dmpi->stride[0]*2, c->stride[0]*2);
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
190 my_memcpy_pic(dmpi->planes[0] + dmpi->stride[0],
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 10956
diff changeset
191 f->ofields[1]->planes[0] + c->stride[0],
10773
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
192 mpi->w, mpi->h/2, dmpi->stride[0]*2, c->stride[0]*2);
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
193 if (mpi->flags & MP_IMGFLAG_PLANAR) {
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 10956
diff changeset
194 my_memcpy_pic(dmpi->planes[1], f->ofields[0]->planes[1],
10773
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
195 mpi->chroma_width, mpi->chroma_height/2,
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
196 dmpi->stride[1]*2, c->stride[1]*2);
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
197 my_memcpy_pic(dmpi->planes[1] + dmpi->stride[1],
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 10956
diff changeset
198 f->ofields[1]->planes[1] + c->stride[1],
10773
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
199 mpi->chroma_width, mpi->chroma_height/2,
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
200 dmpi->stride[1]*2, c->stride[1]*2);
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 10956
diff changeset
201 my_memcpy_pic(dmpi->planes[2], f->ofields[0]->planes[2],
10773
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
202 mpi->chroma_width, mpi->chroma_height/2,
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
203 dmpi->stride[2]*2, c->stride[2]*2);
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
204 my_memcpy_pic(dmpi->planes[2] + dmpi->stride[2],
11628
6fc547235443 simplified frame decision logic and reduced the occurrance of length=1
rfelker
parents: 10956
diff changeset
205 f->ofields[1]->planes[2] + c->stride[2],
10773
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
206 mpi->chroma_width, mpi->chroma_height/2,
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
207 dmpi->stride[2]*2, c->stride[2]*2);
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
208 }
012eeac10e16 direct render frames whose fields are not in a common buffer, rather
rfelker
parents: 10738
diff changeset
209 pullup_release_frame(f);
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
210 if (mpi->qscale) {
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
211 dmpi->qscale = vf->priv->qbuf;
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
212 dmpi->qstride = mpi->qstride;
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
213 dmpi->qscale_type = mpi->qscale_type;
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
214 }
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
215 return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
216 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
217 dmpi = vf_get_image(vf->next, mpi->imgfmt,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
218 MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
219 mpi->width, mpi->height);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
220
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
221 dmpi->planes[0] = f->buffer->planes[0];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
222 dmpi->planes[1] = f->buffer->planes[1];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
223 dmpi->planes[2] = f->buffer->planes[2];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
224
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
225 dmpi->stride[0] = c->stride[0];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
226 dmpi->stride[1] = c->stride[1];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
227 dmpi->stride[2] = c->stride[2];
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
228
11629
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
229 if (mpi->qscale) {
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
230 dmpi->qscale = vf->priv->qbuf;
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
231 dmpi->qstride = mpi->qstride;
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
232 dmpi->qscale_type = mpi->qscale_type;
341f3c870013 pass quantizer tables through (averaging values when fields come from
rfelker
parents: 11628
diff changeset
233 }
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
234 ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
235 pullup_release_frame(f);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
236 return ret;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
237 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
238
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
239 static int query_format(struct vf_instance_s* vf, unsigned int fmt)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
240 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
241 /* FIXME - support more formats */
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
242 switch (fmt) {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
243 case IMGFMT_YV12:
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
244 case IMGFMT_IYUV:
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
245 case IMGFMT_I420:
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
246 return vf_next_query_format(vf, fmt);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
247 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
248 return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
249 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
250
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
251 static int config(struct vf_instance_s* vf,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
252 int width, int height, int d_width, int d_height,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
253 unsigned int flags, unsigned int outfmt)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
254 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
255 if (height&3) return 0;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
256 return vf_next_config(vf, width, height, d_width, d_height, flags, outfmt);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
257 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
258
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
259 static void uninit(struct vf_instance_s* vf)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
260 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
261 pullup_free_context(vf->priv->ctx);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
262 free(vf->priv);
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
263 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
264
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
265 static int open(vf_instance_t *vf, char* args)
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
266 {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
267 struct vf_priv_s *p;
12549
bb9bf9a97ac6 configurable 'junk' borders for pullup
rfelker
parents: 12548
diff changeset
268 struct pullup_context *c;
14970
5d566b4628d0 direct rendering support drastically improves speed, but it's buggy. :( disabled for now...
rfelker
parents: 14954
diff changeset
269 //vf->get_image = get_image;
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
270 vf->put_image = put_image;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
271 vf->config = config;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
272 vf->query_format = query_format;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
273 vf->uninit = uninit;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
274 vf->default_reqs = VFCAP_ACCEPT_STRIDE;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
275 vf->priv = p = calloc(1, sizeof(struct vf_priv_s));
12549
bb9bf9a97ac6 configurable 'junk' borders for pullup
rfelker
parents: 12548
diff changeset
276 p->ctx = c = pullup_alloc_context();
14973
08002417b7e4 don't buffer more future context that we need
rfelker
parents: 14970
diff changeset
277 p->fakecount = 1;
15037
dde2f0454527 1l! mplayer's verbose variable is not a flag but a signed number
rfelker
parents: 14973
diff changeset
278 c->verbose = verbose>0;
12549
bb9bf9a97ac6 configurable 'junk' borders for pullup
rfelker
parents: 12548
diff changeset
279 c->junk_left = c->junk_right = 1;
bb9bf9a97ac6 configurable 'junk' borders for pullup
rfelker
parents: 12548
diff changeset
280 c->junk_top = c->junk_bottom = 4;
bb9bf9a97ac6 configurable 'junk' borders for pullup
rfelker
parents: 12548
diff changeset
281 c->strict_breaks = 0;
13267
8d4a16cb1e97 pullup docs + new feature for slow cpus :)
rfelker
parents: 12549
diff changeset
282 c->metric_plane = 0;
12549
bb9bf9a97ac6 configurable 'junk' borders for pullup
rfelker
parents: 12548
diff changeset
283 if (args) {
13267
8d4a16cb1e97 pullup docs + new feature for slow cpus :)
rfelker
parents: 12549
diff changeset
284 sscanf(args, "%d:%d:%d:%d:%d:%d", &c->junk_left, &c->junk_right, &c->junk_top, &c->junk_bottom, &c->strict_breaks, &c->metric_plane);
12549
bb9bf9a97ac6 configurable 'junk' borders for pullup
rfelker
parents: 12548
diff changeset
285 }
10664
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
286 return 1;
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
287 }
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
288
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
289 vf_info_t vf_info_pullup = {
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
290 "pullup (from field sequence to frames)",
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
291 "pullup",
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
292 "Rich Felker",
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
293 "",
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
294 open,
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
295 NULL
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
296 };
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
297
d47ca466c97b pullup -- third generation inverse telecine engine. the backend
rfelker
parents:
diff changeset
298