Staging
v0.8.1
Revision 7c9bcf82436189e69db28df1b3a7cc8d7dd7b5c4 authored by Moshe Zadka on 31 March 2001, 14:26:54 UTC, committed by Moshe Zadka on 31 March 2001, 14:26:54 UTC
  which can be called from a start tag handler.  When the corresponding end
  tag is read the flag is cleared.  However, it didn't get cleared when
  the start tag was for an empty element of the type <tag .../>.  This
  modification fixes the problem.
1 parent ea96661
Raw File
yuvconvert.c

#include "yuv.h"

void
yuv_sv411_to_cl422dc(int invert, void *data, void *yuv, int width, int height)
{
	struct yuv411 *in = data;
	struct yuv422 *out_even = yuv;
	struct yuv422 *out_odd = out_even + width / 2;
	int i, j;		/* counters */

	for (i = height / 2; i--; ) {
		for (j = width / 4; j--; ) {
			YUV422_Y0(*out_even) = YUV411_Y00(*in);
			YUV422_U0(*out_even) = YUV411_U00(*in);
			YUV422_V0(*out_even) = YUV411_V00(*in);
			YUV422_Y1(*out_even) = YUV411_Y01(*in);
			out_even++;
			YUV422_Y0(*out_even) = YUV411_Y02(*in);
			YUV422_U0(*out_even) = YUV411_U02(*in);
			YUV422_V0(*out_even) = YUV411_V02(*in);
			YUV422_Y1(*out_even) = YUV411_Y03(*in);
			out_even++;
			YUV422_Y0(*out_odd) = YUV411_Y10(*in);
			YUV422_U0(*out_odd) = YUV411_U10(*in);
			YUV422_V0(*out_odd) = YUV411_V10(*in);
			YUV422_Y1(*out_odd) = YUV411_Y11(*in);
			out_odd++;
			YUV422_Y0(*out_odd) = YUV411_Y12(*in);
			YUV422_U0(*out_odd) = YUV411_U12(*in);
			YUV422_V0(*out_odd) = YUV411_V12(*in);
			YUV422_Y1(*out_odd) = YUV411_Y13(*in);
			out_odd++;
			in++;
		}
		out_even += width / 2;
		out_odd += width / 2;
	}
}

void
yuv_sv411_to_cl422dc_quartersize(int invert, void *data, void *yuv,
				 int width, int height)
{
	int w4 = width / 4;	/* quarter of width is used often */
	struct yuv411 *in_even = data;
	struct yuv411 *in_odd = in_even + w4;
	struct yuv422 *out_even = yuv;
	struct yuv422 *out_odd = out_even + w4;
	int i, j;		/* counters */
	int u, v;		/* U and V values */

	for (i = height / 4; i--; ) {
		for (j = w4; j--; ) {
			u = YUV411_U00(*in_even);
			v = YUV411_V00(*in_even);

			YUV422_Y0(*out_even) = YUV411_Y00(*in_even);
			YUV422_U0(*out_even) = u;
			YUV422_V0(*out_even) = v;
			YUV422_Y1(*out_even) = YUV411_Y02(*in_even);

			YUV422_Y0(*out_odd) = YUV411_Y10(*in_odd);
			YUV422_U0(*out_odd) = u;
			YUV422_V0(*out_odd) = v;
			YUV422_Y1(*out_odd) = YUV411_Y12(*in_odd);

			in_even++;
			in_odd++;
			out_even++;
			out_odd++;
		}
		in_even += w4;
		in_odd += w4;
		out_even += w4;
		out_odd += w4;
	}
}

void
yuv_sv411_to_cl422dc_sixteenthsize(int invert, void *data, void *yuv,
				   int width, int height)
{
	int w4_3 = 3 * width / 4; /* three quarters of width is used often */
	int w8 = width / 8;	/* and so is one eighth */
	struct yuv411 *in_even = data;
	struct yuv411 *in_odd = in_even + width / 2;
	struct yuv422 *out_even = yuv;
	struct yuv422 *out_odd = out_even + w8;
	int i, j;		/* counters */
	int u, v;		/* U and V values */

	for (i = height / 8; i--; ) {
		for (j = w8; j--; ) {
			u = YUV411_U00(in_even[0]);
			v = YUV411_V00(in_even[0]);

			YUV422_Y0(*out_even) = YUV411_Y00(in_even[0]);
			YUV422_U0(*out_even) = u;
			YUV422_V0(*out_even) = v;
			YUV422_Y1(*out_even) = YUV411_Y00(in_even[1]);

			YUV422_Y0(*out_odd) = YUV411_Y00(in_odd[0]);
			YUV422_U0(*out_odd) = u;
			YUV422_V0(*out_odd) = v;
			YUV422_Y1(*out_odd) = YUV411_Y00(in_even[1]);

			in_even += 2;
			in_odd += 2;
			out_even++;
			out_odd++;
		}
		in_even += w4_3;
		in_odd += w4_3;
		out_even += w8;
		out_odd += w8;
	}
}
back to top