[FFmpeg-devel] [PATCH] Add pad filter
Michael Niedermayer
michaelni
Fri Nov 27 02:42:59 CET 2009
On Fri, Nov 27, 2009 at 01:09:28AM +0100, Stefano Sabatini wrote:
[...]
> +static void draw_slice(AVFilterLink *link, int y, int h)
> +{
> + PadContext *pad = link->dst->priv;
> + AVFilterPicRef *pic = link->dst->outputs[0]->outpic;
> + int i, y1, h1;
> + uint8_t *p;
> +
> + if (pad->is_packed_rgb) {
> + /* draw top bar */
> + if (y == 0) {
> + p = pic->data[0];
> + for (i = 0; i < pad->y; i++) {
> + memcpy(p, pad->line, pad->w * pad->pix_step);
> + p += pic->linesize[0];
> + }
> + }
> +
> + /* draw side borders */
> + if (y < link->h) {
> + p = pic->data[0] + (pad->y + y) * pic->linesize[0];
> +
> + for (i = 0; i < h; i++) {
> + /* left border */
> + memcpy(p, pad->line, pad->x * pad->pix_step);
> +
> + /* right border */
> + memcpy(p + (pad->x + link->w) * pad->pix_step, pad->line,
> + (pad->w - pad->x - link->w) * pad->pix_step);
> + p += pic->linesize[0];
> + }
> + }
> +
> + /* draw bottom bar */
> + if ((y+h) >= link->h) {
> + y1 = link->h + pad->y;
> + h1 = pad->h - y1;
> + p = pic->data[0] + y1 * pic->linesize[0];
> + for (i = 0; i < h1; i++) {
> + memcpy(p, pad->line, pad->w * pad->pix_step);
> + p += pic->linesize[0];
> + }
> + }
> + } else {
> + int plane;
> +
> + for (plane = 0; plane < 4 && pic->data[plane]; plane++) {
> + int vsub = plane == 1 || plane == 2 ? pad->vsub : 0;
> + int hsub = plane == 1 || plane == 2 ? pad->hsub : 0;
> +
> + /* draw top bar */
> + if (y == 0) {
> + p = pic->data[plane];
> + for (i = 0; i < (pad->y >> vsub); i++) {
> + memset(p, pad->color[plane], pad->w >> hsub);
> + p += pic->linesize[plane];
> + }
> + }
> +
> + /* draw side borders */
> + if (y < link->h) {
> + p = pic->data[plane] + ((pad->y + y) >>vsub) * pic->linesize[plane];
> +
> + for (i = 0; i < (h >> vsub); i++) {
> + /* left border */
> + memset(p, pad->color[plane], pad->x >> hsub);
> +
> + /* right border */
> + memset(p + ((pad->x + link->w) >> hsub), pad->color[plane],
> + (pad->w - pad->x - link->w) >> hsub);
> + p += pic->linesize[plane];
> + }
> + }
> +
> + /* draw bottom bar */
> + if ((y+h) >= link->h) {
> + y1 = link->h + pad->y;
> + h1 = pad->h - y1;
> + p = pic->data[plane] + pic->linesize[plane] * (y1 >>vsub);
> + for (i = 0; i < (h1 >> vsub); i++) {
> + memset(p, pad->color[plane], pad->w >> hsub);
> + p += pic->linesize[plane];
> + }
> + }
> + }
> + }
a draw_rectangle() function could simplify above
> +
> + y1 = y == 0 ? 0 : y + pad->y;
> + h1 = h;
> + if (y == 0)
> + h1 += pad->y;
> + if (y+h >= link->h)
> + h1 += pad->h - pad->y - link->h;
> +
> + avfilter_draw_slice(link->dst->outputs[0], y1, h1);
this draw slice behaves quite odd, i would have expectd that slices didnt grow
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
The misfortune of the wise is better than the prosperity of the fool.
-- Epicurus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20091127/2a67bd93/attachment.pgp>
More information about the ffmpeg-devel
mailing list