annotate libmpcodecs/vf_tile.c @ 15978:c8dc500e078e

memcpy and memmove both copy memory, but when using memcpy the source and destination must not overlap, but here, they did overlap. Committed with the kind blessing of Richard, patch by uau
author gpoirier
date Fri, 15 Jul 2005 22:09:30 +0000
parents 81d03cb2cd64
children 6ff3379a0862
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10751
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
1 /*
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
2 * vf_tile.c - filter to tile a serie of image in a single, bigger, image
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
3 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
4 * The parameters are:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
5 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
6 * xtile: number of tile on the x axis (5)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
7 * ytile: number of tile on the y axis (5)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
8 * xytile: when write the image, it can be different then xtile * ytile
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
9 * (for example you can write 8 * 7 tile, writing the file every
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
10 * 50 frame, to have one image every 2 seconds @ 25 fps ).
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
11 * start: pixel at the start (x/y), default 2
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
12 * delta: pixel between 2 tile, (x/y), default 4
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
13 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
14 * For example a valid command line is:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
15 * ... -vf tile=10:5:-1:4:8 ...
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
16 * that make images of 10 * 5 tiles, with 4 pixel at the beginning and
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
17 * 8 pixel between tiles.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
18 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
19 * The default command is:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
20 * ... -vf tile=5:5:25:2:4
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
21 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
22 * If you omit a parameter or put a value less then 0, the default is used.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
23 * ... -vf tile=10:5::-1:10
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
24 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
25 * You can also stop when you're ok
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
26 * ... -vf tile=10:5
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
27 * (and this is probably the option you will use more often ...)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
28 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
29 * Probably is good to put the scale filter before the tile :-)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
30 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
31 * Daniele Forghieri ( guru@digitalfantasy.it )
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
32 */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
33
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
34 // strtoi memcpy_pic
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
35
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
36 #include <stdio.h>
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
37 #include <stdlib.h>
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
38 #include <string.h>
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
39
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
40 #include "../config.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
41 #include "../mp_msg.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
42 #include "../cpudetect.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
43
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
44 #include "img_format.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
45 #include "mp_image.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
46 #include "vf.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
47
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
48 #include "../libvo/fastmemcpy.h"
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
49
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
50 /* external */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
51 extern int verbose;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
52
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
53 /* private data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
54 struct vf_priv_s {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
55 /* configuration data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
56 /* Number on hor/ver tiles */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
57 int xtile;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
58 int ytile;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
59 /* When write the whole frame (default = xtile * ytile) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
60 int xytile;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
61 /* pixel at start / end (default = 4) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
62 int start;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
63 /* pixel between image (default = 2) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
64 int delta;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
65 // /* Background color, in destination format */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
66 // int bkgSet;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
67
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
68 /* Work data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
69 int frame_cur;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
70 };
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
71
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
72
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
73 static int config(struct vf_instance_s* vf,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
74 int width, int height, int d_width, int d_height,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
75 unsigned int flags, unsigned int outfmt){
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
76
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
77 struct vf_priv_s *priv;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
78 int xw;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
79 int yh;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
80
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
81 /* Calculate new destination size */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
82 priv = vf->priv;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
83 xw = priv->start * 2 +
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
84 priv->xtile * width +
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
85 (priv->xtile - 1) * priv->delta;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
86 yh = priv->start * 2 +
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
87 priv->ytile * height +
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
88 (priv->ytile - 1) * priv->delta;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
89
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
90 mp_msg(MSGT_VFILTER,MSGL_V,"vf_tile:config size set to %d * %d\n", xw, yh);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
91
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
92 return vf_next_config(vf, xw, yh, xw, yh, flags, outfmt);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
93 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
94
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
95 /* Filter handler */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
96 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
97 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
98 mp_image_t *dmpi;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
99 struct vf_priv_s *priv;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
100 int t;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
101 int xw;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
102 int yh;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
103 int xi;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
104 int yi;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
105 int by;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
106 int dw;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
107
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
108 /* Calculate new size */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
109 priv = vf->priv;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
110 xw = priv->start * 2 +
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
111 priv->xtile * mpi->w +
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
112 (priv->xtile - 1) * priv->delta;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
113 yh = priv->start * 2 +
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
114 priv->ytile * mpi->h+
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
115 (priv->ytile - 1) * priv->delta;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
116
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
117 /* Get the big image! */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
118 dmpi=vf_get_image(vf->next, mpi->imgfmt,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
119 MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
120 xw, yh);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
121
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
122 /* bytes x pixel & bytes x line */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
123 if (mpi->flags & MP_IMGFLAG_PLANAR) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
124 by = 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
125 dw = mpi->w;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
126 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
127 else {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
128 by = (mpi->bpp + 7) / 8;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
129 dw = mpi->w * by;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
130 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
131 /* Index position */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
132 t = priv->frame_cur % priv->xytile;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
133 // if ((t == 0) && (bkg != 0)) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
134 // /* First frame, delete the background */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
135 //
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
136 // }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
137
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
138 /* Position of image */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
139 xi = priv->start + (mpi->w + priv->delta) * (t % priv->xtile);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
140 yi = priv->start + (mpi->h + priv->delta) * (t / priv->xtile);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
141
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
142 /* Copy first (or only) plane */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
143 memcpy_pic( dmpi->planes[0] + xi * by + yi * dmpi->stride[0],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
144 mpi->planes[0],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
145 dw,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
146 mpi->h,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
147 dmpi->stride[0],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
148 mpi->stride[0]);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
149
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
150 if (mpi->flags & MP_IMGFLAG_PLANAR) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
151 /* Copy the other 2 planes */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
152 memcpy_pic( dmpi->planes[1] + (xi >> mpi->chroma_x_shift) + (yi >> mpi->chroma_y_shift) * dmpi->stride[1],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
153 mpi->planes[1],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
154 mpi->chroma_width,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
155 mpi->chroma_height,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
156 dmpi->stride[1],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
157 mpi->stride[1]);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
158 memcpy_pic( dmpi->planes[2] + (xi >> mpi->chroma_x_shift) + (yi >> mpi->chroma_y_shift) * dmpi->stride[2],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
159 mpi->planes[2],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
160 mpi->chroma_width,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
161 mpi->chroma_height,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
162 dmpi->stride[2],
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
163 mpi->stride[2]);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
164 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
165
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
166 /* Increment current frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
167 ++priv->frame_cur;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
168
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
169 if (t == priv->xytile - 1) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
170 /* Display the composition */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
171 dmpi->width = xw;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
172 dmpi->height = yh;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
173 return vf_next_put_image(vf, dmpi);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
174 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
175 else {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
176 /* Skip the frame */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
177 return(0);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
178 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
179 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
180
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
181 static void uninit(struct vf_instance_s* vf)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
182 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
183 /* free local data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
184 free(vf->priv);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
185 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
186
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
187 /* rgb/bgr 15->32 supported & some Yxxx */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
188 static int query_format(struct vf_instance_s* vf, unsigned int fmt)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
189 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
190 switch (fmt) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
191 /* rgb 15 -> 32 bit */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
192 case IMGFMT_RGB15:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
193 case IMGFMT_RGB16:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
194 case IMGFMT_RGB24:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
195 case IMGFMT_RGB32:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
196 /* bgr 15 -> 32 bit */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
197 case IMGFMT_BGR15:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
198 case IMGFMT_BGR16:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
199 case IMGFMT_BGR24:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
200 case IMGFMT_BGR32:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
201 /* Various Yxxx Formats */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
202 case IMGFMT_444P:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
203 case IMGFMT_422P:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
204 case IMGFMT_411P:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
205 case IMGFMT_YUY2:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
206 case IMGFMT_YV12:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
207 case IMGFMT_I420:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
208 case IMGFMT_YVU9:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
209 case IMGFMT_IF09:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
210 case IMGFMT_IYUV:
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
211 return vf_next_query_format(vf, fmt);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
212 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
213 return 0;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
214 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
215
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
216 /* Get an integer from the string pointed by s, adjusting s.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
217 * If the value is less then 0 def_val is used.
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
218 * Return 0 for ok
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
219 *
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
220 * Look below ( in open(...) ) for a use ...
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
221 */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
222 static int parse_int(char **s, int *rt, int def_val)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
223 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
224
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
225 int t = 0;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
226
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
227 if (**s) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
228 /* Get value (dec, hex or octal) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
229 t = strtol( *s, s, 0 );
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
230
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
231 /* Use default */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
232 if (t < 0) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
233 t = def_val;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
234 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
235
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
236 if (**s == ':') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
237 /* Point to next character (problably a digit) */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
238 ++(*s);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
239 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
240 else if (**s != '\0') {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
241 /* Error, we got some wrong char */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
242 return(1);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
243 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
244 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
245 else {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
246 t = def_val;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
247 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
248
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
249 *rt = t;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
250 return(0);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
251
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
252 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
253
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
254 /* Main entry funct for the filter */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
255 static int open(vf_instance_t *vf, char* args)
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
256 {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
257 struct vf_priv_s *p;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
258 int er;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
259
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
260 vf->put_image = put_image;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
261 vf->query_format = query_format;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
262 vf->config = config;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
263 vf->uninit = uninit;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
264 vf->default_reqs = VFCAP_ACCEPT_STRIDE;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
265 /* Private data */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
266 vf->priv = p = calloc(1, sizeof(struct vf_priv_s));
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
267 if (p == NULL) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
268 return(0);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
269 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
270
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
271 if (args == NULL) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
272 /* Use the default */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
273 args = "";
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
274 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
275 /* Parse all the arguments */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
276 er = parse_int( &args, &p->xtile, 5 );
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
277 er |= parse_int( &args, &p->ytile, 5 );
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
278 er |= parse_int( &args, &p->xytile, 0 );
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
279 er |= parse_int( &args, &p->start, 2 );
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
280 er |= parse_int( &args, &p->delta, 4 );
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
281 // er |= parse_int( &args, &p->bkgSet, 0 );
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
282
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
283 if (er) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
284 printf("Error parsing argument\n");
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
285 return(0);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
286 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
287 /* Load some default */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
288 if ((p->xytile <= 0) || (p->xytile > p->xtile * p->ytile)) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
289 p->xytile = p->xtile * p->ytile;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
290 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
291
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
292 /* Say what happen: use mp_msg(...)? */
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
293 if (verbose) {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
294 printf("vf_tile: tiling %d * %d, output every %d frames\n",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
295 p->xtile,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
296 p->ytile,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
297 p->xytile);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
298 printf("vf_tile: start pixel %d, delta pixel %d\n",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
299 p->start,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
300 p->delta);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
301 // printf("vf_tile: background 0x%x\n",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
302 // p->bkgSet);
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
303 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
304 return 1;
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
305 }
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
306
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
307 vf_info_t vf_info_tile = {
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
308 "Make a single image tiling x/y images",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
309 "tile",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
310 "Daniele Forghieri",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
311 "",
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
312 open,
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
313 NULL
81d03cb2cd64 2 new filters: tile & framestep
arpi
parents:
diff changeset
314 };