66 int max_plane_step[4];
69 char x_expr[256], y_expr[256];
80 sscanf(args,
"%255[^:]:%255[^:]", over->
x_expr, over->
y_expr);
153 "main w:%d h:%d fmt:%s overlay x:%d y:%d w:%d h:%d fmt:%s\n",
160 if (over->
x < 0 || over->
y < 0 ||
164 "Overlay area (%d,%d)<->(%d,%d) not within the main area (0,0)<->(%d,%d) or zero-sized\n",
168 (
int)var_values[
VAR_MAIN_W], (
int)var_values[VAR_MAIN_H]);
175 "Error when evaluating the expression '%s'\n", expr);
189 (int64_t)tb2.
num * tb1.
den),
190 (int64_t)tb1.
den * tb2.
den, INT_MAX);
192 "main_tb:%d/%d overlay_tb:%d/%d -> tb:%d/%d exact:%d\n",
196 "Timestamp conversion inexact, timestamp information loss may occurr\n");
245 int x,
int y,
int w,
int h,
246 int slice_y,
int slice_w,
int slice_h)
251 int overlay_end_y = y+h;
252 int slice_end_y = slice_y+slice_h;
255 width =
FFMIN(slice_w - x, w);
256 end_y =
FFMIN(slice_end_y, overlay_end_y);
257 start_y =
FFMAX(y, slice_y);
258 height = end_y - start_y;
261 uint8_t *dp = dst->
data[0] + x * 3 + start_y * dst->
linesize[0];
262 uint8_t *
sp = src->
data[0];
266 sp += (slice_y - y) * src->
linesize[0];
268 uint8_t *d = dp, *s =
sp;
269 for (j = 0; j <
width; j++) {
270 d[
r] = (d[
r] * (0xff - s[3]) + s[0] * s[3] + 128) >> 8;
271 d[1] = (d[1] * (0xff - s[3]) + s[1] * s[3] + 128) >> 8;
272 d[
b] = (d[
b] * (0xff - s[3]) + s[2] * s[3] + 128) >> 8;
280 for (i = 0; i < 3; i++) {
281 int hsub = i ? over->
hsub : 0;
282 int vsub = i ? over->
vsub : 0;
283 uint8_t *dp = dst->
data[i] + (x >> hsub) +
284 (start_y >> vsub) * dst->
linesize[i];
285 uint8_t *
sp = src->
data[i];
286 uint8_t *ap = src->
data[3];
287 int wp =
FFALIGN(width, 1<<hsub) >> hsub;
288 int hp =
FFALIGN(height, 1<<vsub) >> vsub;
290 sp += ((slice_y - y) >> vsub) * src->
linesize[i];
291 ap += (slice_y - y) * src->
linesize[3];
293 for (j = 0; j < hp; j++) {
294 uint8_t *d = dp, *s =
sp, *a = ap;
295 for (k = 0; k < wp; k++) {
297 int alpha_v, alpha_h, alpha;
298 if (hsub && vsub && j+1 < hp && k+1 < wp) {
299 alpha = (a[0] + a[src->
linesize[3]] +
301 }
else if (hsub || vsub) {
302 alpha_h = hsub && k+1 < wp ?
303 (a[0] + a[1]) >> 1 : a[0];
304 alpha_v = vsub && j+1 < hp ?
305 (a[0] + a[src->
linesize[3]]) >> 1 : a[0];
306 alpha = (alpha_v + alpha_h) >> 1;
309 *d = (*d * (0xff - alpha) + *s++ * alpha + 128) >> 8;
315 ap += (1 << vsub) * src->
linesize[3];
329 !(over->
x >= outpicref->
video->
w || over->
y >= outpicref->
video->
h ||
333 y, outpicref->
video->
w, h);