2 * Copyright (C) 2003 Mike Melanson
3 * Copyright (C) 2003 Dr. Tim Ferguson
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * id RoQ Video common functions based on work by Dr. Tim Ferguson
30 static inline void block_copy(unsigned char *out
, unsigned char *in
,
31 int outstride
, int instride
, int sz
)
41 void ff_apply_vector_2x2(RoqContext
*ri
, int x
, int y
, roq_cell
*cell
)
46 stride
= ri
->current_frame
->linesize
[0];
49 bptr
= ri
->current_frame
->data
[0] + boffs
;
50 bptr
[0 ] = cell
->y
[0];
51 bptr
[1 ] = cell
->y
[1];
52 bptr
[stride
] = cell
->y
[2];
53 bptr
[stride
+1] = cell
->y
[3];
55 stride
= ri
->current_frame
->linesize
[1];
58 bptr
= ri
->current_frame
->data
[1] + boffs
;
62 bptr
[stride
+1] = cell
->u
;
64 bptr
= ri
->current_frame
->data
[2] + boffs
;
68 bptr
[stride
+1] = cell
->v
;
71 void ff_apply_vector_4x4(RoqContext
*ri
, int x
, int y
, roq_cell
*cell
)
76 stride
= ri
->current_frame
->linesize
[0];
79 bptr
= ri
->current_frame
->data
[0] + boffs
;
80 bptr
[ 0] = bptr
[ 1] = bptr
[stride
] = bptr
[stride
+1] = cell
->y
[0];
81 bptr
[ 2] = bptr
[ 3] = bptr
[stride
+2] = bptr
[stride
+3] = cell
->y
[1];
82 bptr
[stride
*2 ] = bptr
[stride
*2+1] = bptr
[stride
*3 ] = bptr
[stride
*3+1] = cell
->y
[2];
83 bptr
[stride
*2+2] = bptr
[stride
*2+3] = bptr
[stride
*3+2] = bptr
[stride
*3+3] = cell
->y
[3];
85 stride
= ri
->current_frame
->linesize
[1];
88 bptr
= ri
->current_frame
->data
[1] + boffs
;
89 bptr
[ 0] = bptr
[ 1] = bptr
[stride
] = bptr
[stride
+1] =
90 bptr
[ 2] = bptr
[ 3] = bptr
[stride
+2] = bptr
[stride
+3] =
91 bptr
[stride
*2 ] = bptr
[stride
*2+1] = bptr
[stride
*3 ] = bptr
[stride
*3+1] =
92 bptr
[stride
*2+2] = bptr
[stride
*2+3] = bptr
[stride
*3+2] = bptr
[stride
*3+3] = cell
->u
;
94 bptr
= ri
->current_frame
->data
[2] + boffs
;
95 bptr
[ 0] = bptr
[ 1] = bptr
[stride
] = bptr
[stride
+1] =
96 bptr
[ 2] = bptr
[ 3] = bptr
[stride
+2] = bptr
[stride
+3] =
97 bptr
[stride
*2 ] = bptr
[stride
*2+1] = bptr
[stride
*3 ] = bptr
[stride
*3+1] =
98 bptr
[stride
*2+2] = bptr
[stride
*2+3] = bptr
[stride
*3+2] = bptr
[stride
*3+3] = cell
->v
;
102 static inline void apply_motion_generic(RoqContext
*ri
, int x
, int y
, int deltax
,
110 /* check MV against frame boundaries */
111 if ((mx
< 0) || (mx
> ri
->width
- sz
) ||
112 (my
< 0) || (my
> ri
->height
- sz
)) {
113 av_log(ri
->avctx
, AV_LOG_ERROR
, "motion vector out of bounds: MV = (%d, %d), boundaries = (0, 0, %d, %d)\n",
114 mx
, my
, ri
->width
, ri
->height
);
118 for(cp
= 0; cp
< 3; cp
++) {
119 int outstride
= ri
->current_frame
->linesize
[cp
];
120 int instride
= ri
->last_frame
->linesize
[cp
];
121 block_copy(ri
->current_frame
->data
[cp
] + y
*outstride
+ x
,
122 ri
->last_frame
->data
[cp
] + my
*instride
+ mx
,
123 outstride
, instride
, sz
);
128 void ff_apply_motion_4x4(RoqContext
*ri
, int x
, int y
,
129 int deltax
, int deltay
)
131 apply_motion_generic(ri
, x
, y
, deltax
, deltay
, 4);
134 void ff_apply_motion_8x8(RoqContext
*ri
, int x
, int y
,
135 int deltax
, int deltay
)
137 apply_motion_generic(ri
, x
, y
, deltax
, deltay
, 8);