aboutsummaryrefslogtreecommitdiff
path: root/mbone/vic/files/patch-af
diff options
context:
space:
mode:
Diffstat (limited to 'mbone/vic/files/patch-af')
-rw-r--r--mbone/vic/files/patch-af757
1 files changed, 0 insertions, 757 deletions
diff --git a/mbone/vic/files/patch-af b/mbone/vic/files/patch-af
deleted file mode 100644
index cd4e0bcfa2ba..000000000000
--- a/mbone/vic/files/patch-af
+++ /dev/null
@@ -1,757 +0,0 @@
---- grabber-meteor.cc.orig Fri Jun 26 11:25:55 1998
-+++ grabber-meteor.cc Fri Jun 26 11:18:53 1998
-@@ -43,7 +43,6 @@
- *
- */
-
--/*#define FRAME_CNTS /* print frame counts and fps when device stops -- debug */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
-@@ -51,16 +50,16 @@
- #include <sys/types.h>
- #include <sys/ioctl.h>
- #include <sys/mman.h>
--#ifdef FRAME_CNTS
--#include <sys/time.h>
--#endif
-
- #include "grabber.h"
-+#include "crdef.h"
- #include "Tcl.h"
- #include "device-input.h"
- #include "module.h"
-+#include "bsd-endian.h"
-
- #include <machine/ioctl_meteor.h>
-+#include <machine/ioctl_bt848.h>
-
- /*XXX*/
- #define NTSC_WIDTH 320
-@@ -72,62 +71,78 @@
-
-
- class MeteorGrabber : public Grabber {
-- public:
-- MeteorGrabber(const char* name, const char* format);
-+ public:
-+ MeteorGrabber(const char* name);
- virtual ~MeteorGrabber();
-+ virtual int command(int argc, const char*const* argv);
-+ virtual void fps(int);
- virtual void start();
- virtual void stop();
-- virtual void fps(int);
-- protected:
-- virtual int command(int argc, const char*const* argv);
-- virtual int capture();
- virtual int grab();
-+ protected:
- void format();
-- void setsize();
-+ virtual void setsize() = 0;
-+ void suppress(const u_char* in, int istride);
-+ virtual void saveblks(const u_char* in, int istride) = 0;
-+ void set_size_meteor(int w, int h);
-
- int video_format_; /* video input format: NTSC or PAL */
- int dev_; /* device fd */
- int port_; /* video input port */
-- int coder_format_; /* 411, 422, or cif */
- u_int basewidth_; /* Height of frame to be captured */
- u_int baseheight_; /* Width of frame to be captured */
- u_int decimate_; /* division of base sizes */
- volatile u_int* pyuv_; /* pointer to yuv data */
--#ifdef FRAME_CNTS
-- struct meteor_counts cnts_; /* pointer to counters */
-- double start_time_;
--#endif
-+ int tuner_ ; /* tuner device... */
- };
-
--static const int f_411 = 0; /* coder_format_s */
--static const int f_422 = 1;
--static const int f_cif = 2;
-+class Meteor422Grabber : public MeteorGrabber {
-+ public:
-+ Meteor422Grabber(const char* name);
-+ protected:
-+ void setsize();
-+ void saveblk(const u_char* in, u_char* yp, u_char* up, u_char* vp,
-+ int stride, int istride);
-+ void saveblks(const u_char* in, int istride);
-+};
-+
-+class MeteorCIFGrabber : public MeteorGrabber {
-+ public:
-+ MeteorCIFGrabber(const char* name);
-+ protected:
-+ void setsize();
-+ void saveblk(const u_char* in, u_char* yp, u_char* up, u_char* vp,
-+ int stride, int istride);
-+ void saveblks(const u_char* in, int istride);
-+};
-
- class MeteorDevice : public InputDevice {
-- public:
-+ public:
- MeteorDevice(const char* nickname, const char* devname, int free);
- virtual int command(int argc, const char*const* argv);
-- protected:
-+ protected:
- const char* name_;
- };
-
- class MeteorScanner {
-- public:
-+ public:
- MeteorScanner(const int n);
- };
-+
- static MeteorScanner find_meteor_devices(4);
-
- MeteorScanner::MeteorScanner(const int n)
- {
-- char* devname_template = "/dev/meteor%d";
-- char* nickname_template = "Matrox Meteor %d";
-+ static char *d[] = { "/dev/bktr%d", "/dev/meteor%d", NULL };
-+ char *nickname_template = "meteor-%d";
-
- for(int i = 0; i < n; i++) {
-- char *devname = new char[strlen(devname_template) + 3];
-+ for (int j = 0 ; d[j] != NULL ; j++) {
-+ char *devname = new char[strlen(d[j]) + 3];
- char *nickname = new char[strlen(nickname_template) + 3];
-
-+ sprintf(devname, d[j], i);
- sprintf(nickname, nickname_template, i + 1);
-- sprintf(devname, devname_template, i);
- if(access(devname, R_OK) == 0) {
- int fd = open(devname, O_RDONLY);
- if(fd < 0) {
-@@ -140,8 +155,9 @@
- delete nickname;
- delete devname;
- }
-+ }
-+ }
- }
--}
-
- MeteorDevice::MeteorDevice(const char* nickname, const char *devname, int free):
- InputDevice(nickname), name_(devname)
-@@ -149,6 +165,7 @@
- if(free)
- attributes_ = "\
- format {422 411} \
-+type {pal ntsc secam auto} \
- size {large normal small cif} \
- port {RCA Port-1 Port-2 Port-3 S-Video RGB}";
- else
-@@ -160,7 +177,10 @@
- Tcl& tcl = Tcl::instance();
- if ((argc == 3) && (strcmp(argv[1], "open") == 0)) {
- TclObject* o = 0;
-- o = new MeteorGrabber(name_, argv[2]);
-+ if (strcmp(argv[2], "422") == 0)
-+ o = new Meteor422Grabber(name_);
-+ else if (strcmp(argv[2], "cif") == 0)
-+ o = new MeteorCIFGrabber(name_);
- if (o != 0)
- tcl.result(o->name());
- return (TCL_OK);
-@@ -168,19 +188,15 @@
- return (InputDevice::command(argc, argv));
- }
-
--MeteorGrabber::MeteorGrabber(const char* name, const char* format)
-+MeteorGrabber::MeteorGrabber(const char* name)
- {
-- coder_format_ = -1;
-- if(!strcmp(format, "411")) coder_format_ = f_411;
-- if(!strcmp(format, "422")) coder_format_ = f_422;
-- if(!strcmp(format, "cif")) coder_format_ = f_cif;
-- if(coder_format_ == -1) {
-- fprintf(stderr,
-- "vic: MeteorGrabber: unsupported format: %s\n",
-- format);
-- abort();
-- }
--
-+ int devnum;
-+ if (sscanf(name, "/dev/bktr%d", &devnum) == 1) {
-+ char *tunerdev = new char[strlen(name) + 3];
-+ sprintf(tunerdev, "/dev/tuner%d", devnum);
-+ tuner_ = open(tunerdev, O_RDONLY);
-+ } else
-+ tuner_ = -1;
- dev_ = open(name, O_RDONLY);
- if (dev_ == -1) {
- status_ = -1;
-@@ -203,52 +219,33 @@
- if (dev_ != -1) {
- close(dev_);
- }
-+ if (tuner_ != -1)
-+ close(tuner_);
- }
-
--void MeteorGrabber::setsize()
-+void MeteorGrabber::set_size_meteor(int w, int h)
- {
- struct meteor_geomet geom;
-
-- geom.rows = (baseheight_ / decimate_) &~0xf; /* 0xf, ugh! */
-- geom.columns = (basewidth_ / decimate_) &~0xf;
-+ geom.rows = h &~0xf; /* 0xf, ugh! */
-+ geom.columns = w &~0xf;
- geom.frames = 1;
-- geom.oformat = METEOR_GEO_UNSIGNED;
-- geom.oformat |= METEOR_GEO_YUV_422;
-+ geom.oformat = METEOR_GEO_UNSIGNED | METEOR_GEO_YUV_PACKED;
- /*
- * If we can get by with only reading even fields, then by all
- * means do so.
- */
- unsigned short status;
-- ioctl(dev_, METEORSTATUS, &status);
-- if(status & METEOR_STATUS_HCLK) { /* do we have a source? */
-- /* No source, assume ntsc*/
-+ // ioctl(dev_, METEORSTATUS, &status);
-+ if ( video_format_ == METEOR_FMT_NTSC ) {
- if(geom.rows <= NTSC_HEIGHT && geom.columns <= NTSC_WIDTH)
- geom.oformat |= METEOR_GEO_EVEN_ONLY;
- } else {
-- if(status & METEOR_STATUS_FIDT) { /* is it pal or ntsc? */
-- /* 60 hz */
-- if(geom.rows<=NTSC_HEIGHT && geom.columns<=NTSC_WIDTH)
-- geom.oformat |= METEOR_GEO_EVEN_ONLY;
-- } else { /* 50 hz */
- if(geom.rows<=PAL_HEIGHT && geom.columns<=PAL_WIDTH)
- geom.oformat |= METEOR_GEO_EVEN_ONLY;
- }
-- }
--
- if(ioctl(dev_, METEORSETGEO, &geom) < 0)
- perror("vic: METERSETGEO: ");
--
-- switch(coder_format_) {
-- case f_422:
-- set_size_422(geom.columns, geom.rows);
-- break;
-- case f_cif:
-- case f_411:
-- set_size_411(geom.columns, geom.rows);
-- break;
-- }
--
-- allocref(); /* allocate reference frame */
- }
-
- void MeteorGrabber::format()
-@@ -285,11 +282,6 @@
- baseheight_ = PAL_HEIGHT * 2;
- basewidth_ = PAL_WIDTH * 2;
- }
--
-- if(coder_format_ == f_cif) {
-- baseheight_ = CIF_HEIGHT * 2;
-- basewidth_ = CIF_WIDTH * 2;
-- }
- setsize();
- }
-
-@@ -299,15 +291,6 @@
- format();
- int cmd = METEOR_CAP_SINGLE;
- ioctl(dev_, METEORCAPTUR, (char*)&cmd);
--#ifdef FRAME_CNTS
-- cnts_.fifo_errors = 0;
-- cnts_.dma_errors = 0;
-- cnts_.frames_captured = 0;
-- cnts_.even_fields_captured = 0;
-- cnts_.odd_fields_captured = 0;
-- ioctl(dev_, METEORSCOUNT, &cnts_);
-- start_time_ = gettimeofday();
--#endif
-
- cmd = METEOR_CAP_CONTINOUS;
- ioctl(dev_, METEORCAPTUR, (char*)&cmd);
-@@ -319,19 +302,6 @@
-
- int cmd = METEOR_CAP_STOP_CONT;
- ioctl(dev_, METEORCAPTUR, (char*)&cmd);
--#ifdef FRAME_CNTS
-- double endtime = gettimeofday() ;
-- ioctl(dev_, METEORGCOUNT, &cnts_);
-- int diff = (int)((endtime-start_time_) * 1e-6 + 0.5);
-- printf("frames = %d, even fields = %d, odd fields = %d,\n\
--fifo errors = %d, dma errors = %d, seconds = %d",
-- cnts_.frames_captured, cnts_.even_fields_captured,
-- cnts_.odd_fields_captured, cnts_.fifo_errors, cnts_.dma_errors,
-- diff);
-- if(diff)
-- printf(",fps = %d", cnts_.frames_captured/diff);
-- printf("\n");
--#endif
- Grabber::stop();
- }
-
-@@ -345,15 +315,15 @@
-
- int MeteorGrabber::command(int argc, const char*const* argv)
- {
-+ Tcl& tcl = Tcl::instance();
- if (argc == 3) {
- if (strcmp(argv[1], "decimate") == 0) {
- int dec = atoi(argv[2]);
-- Tcl& tcl = Tcl::instance();
- if (dec <= 0) {
- tcl.resultf("%s: divide by zero", argv[0]);
- return (TCL_ERROR);
- }
-- if (dec != decimate_) {
-+ if ((u_int)dec != decimate_) {
- decimate_ = dec;
- if(running_) {
- stop();
-@@ -362,7 +332,8 @@
- }
- }
- return (TCL_OK);
-- } else if (strcmp(argv[1], "port") == 0) {
-+ }
-+ if (strcmp(argv[1], "port") == 0) {
- int p = port_;
- if(!strcmp(argv[2], "RCA")) p = METEOR_INPUT_DEV0;
- if(!strcmp(argv[2], "Port-1")) p = METEOR_INPUT_DEV1;
-@@ -377,7 +348,30 @@
- ioctl(dev_, METEORSINPUT, &port_);
- }
- return (TCL_OK);
-- } else if (strcmp(argv[1], "format") == 0 ||
-+ }
-+ if (strcmp(argv[1], "freeze") == 0) {
-+ int cmd = METEOR_CAP_CONTINOUS ;
-+ if ( atoi(argv[2]) != 0 )
-+ cmd = METEOR_CAP_STOP_CONT;
-+ ioctl(dev_, METEORCAPTUR, (char*)&cmd);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "chan") == 0) {
-+ int p = port_;
-+ int c = atoi(argv[2]);
-+ if (c > 0 && c < 199)
-+ p = METEOR_INPUT_DEV1 ;
-+ else
-+ p = METEOR_INPUT_DEV0 ;
-+ if (p != port_) {
-+ port_ = p;
-+ ioctl(dev_, METEORSINPUT, &port_);
-+ }
-+ if (p == METEOR_INPUT_DEV1)
-+ ioctl(tuner_, TVTUNER_SETCHNL, &c);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "format") == 0 ||
- strcmp(argv[1], "type") == 0) {
- if (strcmp(argv[2], "auto") == 0)
- video_format_ = METEOR_FMT_AUTOMODE;
-@@ -390,14 +384,35 @@
- if (running_)
- format();
- return (TCL_OK);
-- } else if (strcmp(argv[1], "contrast") == 0) {
-- contrast(atof(argv[2]));
-- return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "brightness") == 0) {
-+ u_char val = atoi(argv[2]);
-+ ioctl(dev_, METEORSBRIG, &val);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "contrast") == 0) {
-+ u_char val = atoi(argv[2]);
-+ ioctl(dev_, METEORSCONT, &val);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "hue") == 0) {
-+ char val = atoi(argv[2]);
-+ ioctl(dev_, METEORSHUE, &val);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "saturation") == 0) {
-+ u_char val = atoi(argv[2]);
-+ ioctl(dev_, METEORSCSAT, &val);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "uvgain") == 0) {
-+ u_char val = atoi(argv[2]);
-+ ioctl(dev_, METEORSCHCV, &val);
-+ return (TCL_OK);
- }
- } else if (argc == 2) {
- if (strcmp(argv[1], "format") == 0 ||
- strcmp(argv[1], "type") == 0) {
-- Tcl& tcl = Tcl::instance();
- switch (video_format_) {
-
- case METEOR_FMT_AUTOMODE:
-@@ -423,54 +438,316 @@
- return (TCL_OK);
-
- }
-+ if (strcmp(argv[1], "brightness") == 0) {
-+ u_char val;
-+ ioctl(dev_, METEORGBRIG, &val);
-+ tcl.resultf("%d", (unsigned int)val);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "contrast") == 0) {
-+ u_char val;
-+ ioctl(dev_, METEORGCONT, &val);
-+ tcl.resultf("%d", (int)val);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "hue") == 0) {
-+ char val;
-+ ioctl(dev_, METEORGHUE, &val);
-+ tcl.resultf("%d", (int)val);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "saturation") == 0) {
-+ u_char val;
-+ ioctl(dev_, METEORGCSAT, &val);
-+ tcl.resultf("%d", (int)val);
-+ return (TCL_OK);
-+ }
-+ if (strcmp(argv[1], "uvgain") == 0) {
-+ u_char val;
-+ ioctl(dev_, METEORGCHCV, &val);
-+ tcl.resultf("%d", (int)val);
-+ return (TCL_OK);
-+ }
- }
- return (Grabber::command(argc, argv));
- }
-
--int MeteorGrabber::capture()
--{
-- if(pyuv_ == 0) return 0;
--
-- volatile u_int* py = pyuv_;
-- volatile u_int* pu = (u_int *)((u_int)py + (u_int)framesize_);
-- volatile u_int* pv = (u_int *)((u_int)pu + (framesize_ >> 1));
-- u_int* lum = (u_int *)frame_;
-- u_int* uoff = (u_int *)((u_int)lum + (u_int)framesize_);
-- int f422 = coder_format_ == f_422;
-- u_int* voff = (u_int *)((u_int)uoff +
-- (u_int)(framesize_>>(f422?1:2)));
-- int numc = ((basewidth_/decimate_) &~0xf) >> 3;
--
-- for (int row = 0; row < (((baseheight_/decimate_)&~0xf) >> 1); row++) {
-- for(int col = 0; col < numc; col++) {
-- *lum++ = *py++;
-- *lum++ = *py++;
-- *uoff++ = *pu++;
-- *voff++ = *pv++;
-- }
-- for(col = 0; col < numc; col++) {
-- *lum++ = *py++;
-- *lum++ = *py++;
-- if(f422) { /* only copy odd in 4:2:2 format */
-- *uoff++ = *pu++;
-- *voff++ = *pv++;
--
-- }
-- }
-- if(!f422) { /* skip odd if 4:1:1 or cif format */
-- pu += numc;
-- pv += numc;
-- }
-- }
-- return 1;
-+#define U 0
-+#define Y0 1
-+#define V 2
-+#define Y1 3
-+
-+/*
-+ * define these for REPLENISH macro used below
-+ */
-+#define DIFF4(in, frm, v) \
-+ v += (in)[Y0] - (frm)[0]; \
-+ v += (in)[Y1] - (frm)[1]; \
-+ v += (in)[Y0+4] - (frm)[2]; \
-+ v += (in)[Y1+4] - (frm)[3];
-+
-+#define DIFFLINE(in, frm, left, center, right) \
-+ DIFF4(in + 0*8, frm + 0*4, left); \
-+ DIFF4(in + 1*8, frm + 1*4, center); \
-+ DIFF4(in + 2*8, frm + 2*4, center); \
-+ DIFF4(in + 3*8, frm + 3*4, right); \
-+ if (right < 0) \
-+ right = -right; \
-+ if (left < 0) \
-+ left = -left; \
-+ if (center < 0) \
-+ center = -center;
-+
-+void MeteorGrabber::suppress(const u_char* devbuf, int is)
-+{
-+ const u_char* start = frame_ + 16 * vstart_ * outw_ + 16 * hstart_;
-+ REPLENISH(devbuf, start, is, 2,
-+ hstart_, hstop_, vstart_, vstop_);
- }
-
- int MeteorGrabber::grab()
- {
-- if (capture() == 0)
-- return (0);
-- suppress(frame_);
-- saveblks(frame_);
-- YuvFrame f(media_ts(), frame_, crvec_, outw_, outh_);
-+ if (pyuv_ == 0)
-+ return 0;
-+
-+ int istride = inw_ * 2;
-+ suppress((u_char*)pyuv_, istride);
-+ saveblks((u_char*)pyuv_, istride);
-+ u_int32_t ts = media_ts();
-+ YuvFrame f(ts, frame_, crvec_, outw_, outh_);
- return (target_->consume(&f));
-+}
-+
-+Meteor422Grabber::Meteor422Grabber(const char* name)
-+ : MeteorGrabber(name)
-+{
-+}
-+
-+MeteorCIFGrabber::MeteorCIFGrabber(const char* name)
-+ : MeteorGrabber(name)
-+{
-+}
-+
-+void Meteor422Grabber::setsize()
-+{
-+ int w = basewidth_ / decimate_;
-+ int h = baseheight_ / decimate_;
-+ set_size_meteor(w, h);
-+ set_size_422(w, h);
-+}
-+
-+inline void
-+Meteor422Grabber::saveblk(const u_char* in,
-+ u_char* yp, u_char* up, u_char* vp, int stride, int istride)
-+{
-+ for (int i = 16; --i >= 0; ) {
-+ /*
-+ * Each iteration of this loop grabs 16 Ys & 8 U/Vs.
-+ */
-+ register u_int y0, y1, u, v;
-+
-+ u = in[U + 0*4] << SHIFT(24) |
-+ in[U + 1*4] << SHIFT(16) |
-+ in[U + 2*4] << SHIFT(8) |
-+ in[U + 3*4] << SHIFT(0);
-+ v = in[V + 0*4] << SHIFT(24) |
-+ in[V + 1*4] << SHIFT(16) |
-+ in[V + 2*4] << SHIFT(8) |
-+ in[V + 3*4] << SHIFT(0);
-+ y0 = in[Y0 + 0*4] << SHIFT(24) |
-+ in[Y1 + 0*4] << SHIFT(16) |
-+ in[Y0 + 1*4] << SHIFT(8) |
-+ in[Y1 + 1*4] << SHIFT(0);
-+ y1 = in[Y0 + 2*4] << SHIFT(24) |
-+ in[Y1 + 2*4] << SHIFT(16) |
-+ in[Y0 + 3*4] << SHIFT(8) |
-+ in[Y1 + 3*4] << SHIFT(0);
-+
-+ ((u_int*)yp)[0] = y0;
-+ ((u_int*)yp)[1] = y1;
-+ ((u_int*)up)[0] = u;
-+ ((u_int*)vp)[0] = v;
-+
-+ u = in[U + 4*4] << SHIFT(24) |
-+ in[U + 5*4] << SHIFT(16) |
-+ in[U + 6*4] << SHIFT(8) |
-+ in[U + 7*4] << SHIFT(0);
-+ v = in[V + 4*4] << SHIFT(24) |
-+ in[V + 5*4] << SHIFT(16) |
-+ in[V + 6*4] << SHIFT(8) |
-+ in[V + 7*4] << SHIFT(0);
-+ y0 = in[Y0 + 4*4] << SHIFT(24) |
-+ in[Y1 + 4*4] << SHIFT(16) |
-+ in[Y0 + 5*4] << SHIFT(8) |
-+ in[Y1 + 5*4] << SHIFT(0);
-+ y1 = in[Y0 + 6*4] << SHIFT(24) |
-+ in[Y1 + 6*4] << SHIFT(16) |
-+ in[Y0 + 7*4] << SHIFT(8) |
-+ in[Y1 + 7*4] << SHIFT(0);
-+
-+ ((u_int*)yp)[2] = y0;
-+ ((u_int*)yp)[3] = y1;
-+ ((u_int*)up)[1] = u;
-+ ((u_int*)vp)[1] = v;
-+
-+ in += istride;
-+ yp += stride;
-+ up += stride >> 1;
-+ vp += stride >> 1;
-+ }
-+}
-+
-+void Meteor422Grabber::saveblks(const u_char* devbuf, int is)
-+{
-+ u_char* crv = crvec_;
-+ int off = framesize_;
-+ u_char* lum = frame_;
-+ u_char* chm = lum + off;
-+ off >>= 1;
-+ int stride = 15 * outw_;
-+ int istride = is * 15;
-+ for (int y = 0; y < blkh_; ++y) {
-+ for (int x = 0; x < blkw_; ++x) {
-+ int s = *crv++;
-+ if ((s & CR_SEND) != 0)
-+ saveblk(devbuf, lum, chm, chm + off, outw_, is);
-+
-+ devbuf += 32;
-+ lum += 16;
-+ chm += 8;
-+ }
-+ lum += stride;
-+ chm += stride >> 1;
-+ devbuf += istride;
-+ }
-+}
-+
-+void MeteorCIFGrabber::setsize()
-+{
-+ int w = basewidth_ / decimate_;
-+ int h = baseheight_ / decimate_;
-+ set_size_meteor(w, h);
-+ set_size_cif(w, h);
-+}
-+
-+inline void
-+MeteorCIFGrabber::saveblk(const u_char* in,
-+ u_char* yp, u_char* up, u_char* vp, int stride, int istride)
-+{
-+ for (int i = 8; --i >= 0; ) {
-+ /*
-+ * Each iteration of this loop grabs 32 Ys & 16 U/Vs.
-+ */
-+ register u_int y0, y1, u, v;
-+
-+ u = in[U + 0*4] << SHIFT(24) |
-+ in[U + 1*4] << SHIFT(16) |
-+ in[U + 2*4] << SHIFT(8) |
-+ in[U + 3*4] << SHIFT(0);
-+ v = in[V + 0*4] << SHIFT(24) |
-+ in[V + 1*4] << SHIFT(16) |
-+ in[V + 2*4] << SHIFT(8) |
-+ in[V + 3*4] << SHIFT(0);
-+ y0 = in[Y0 + 0*4] << SHIFT(24) |
-+ in[Y1 + 0*4] << SHIFT(16) |
-+ in[Y0 + 1*4] << SHIFT(8) |
-+ in[Y1 + 1*4] << SHIFT(0);
-+ y1 = in[Y0 + 2*4] << SHIFT(24) |
-+ in[Y1 + 2*4] << SHIFT(16) |
-+ in[Y0 + 3*4] << SHIFT(8) |
-+ in[Y1 + 3*4] << SHIFT(0);
-+
-+ ((u_int*)yp)[0] = y0;
-+ ((u_int*)yp)[1] = y1;
-+ ((u_int*)up)[0] = u;
-+ ((u_int*)vp)[0] = v;
-+
-+ u = in[U + 4*4] << SHIFT(24) |
-+ in[U + 5*4] << SHIFT(16) |
-+ in[U + 6*4] << SHIFT(8) |
-+ in[U + 7*4] << SHIFT(0);
-+ v = in[V + 4*4] << SHIFT(24) |
-+ in[V + 5*4] << SHIFT(16) |
-+ in[V + 6*4] << SHIFT(8) |
-+ in[V + 7*4] << SHIFT(0);
-+ y0 = in[Y0 + 4*4] << SHIFT(24) |
-+ in[Y1 + 4*4] << SHIFT(16) |
-+ in[Y0 + 5*4] << SHIFT(8) |
-+ in[Y1 + 5*4] << SHIFT(0);
-+ y1 = in[Y0 + 6*4] << SHIFT(24) |
-+ in[Y1 + 6*4] << SHIFT(16) |
-+ in[Y0 + 7*4] << SHIFT(8) |
-+ in[Y1 + 7*4] << SHIFT(0);
-+
-+ ((u_int*)yp)[2] = y0;
-+ ((u_int*)yp)[3] = y1;
-+ ((u_int*)up)[1] = u;
-+ ((u_int*)vp)[1] = v;
-+
-+ in += istride;
-+ yp += stride;
-+ up += stride >> 1;
-+ vp += stride >> 1;
-+
-+ /* do the 2nd (y only instead of yuv) line */
-+
-+ y0 = in[Y0 + 0*4] << SHIFT(24) |
-+ in[Y1 + 0*4] << SHIFT(16) |
-+ in[Y0 + 1*4] << SHIFT(8) |
-+ in[Y1 + 1*4] << SHIFT(0);
-+ y1 = in[Y0 + 2*4] << SHIFT(24) |
-+ in[Y1 + 2*4] << SHIFT(16) |
-+ in[Y0 + 3*4] << SHIFT(8) |
-+ in[Y1 + 3*4] << SHIFT(0);
-+
-+ ((u_int*)yp)[0] = y0;
-+ ((u_int*)yp)[1] = y1;
-+
-+ y0 = in[Y0 + 4*4] << SHIFT(24) |
-+ in[Y1 + 4*4] << SHIFT(16) |
-+ in[Y0 + 5*4] << SHIFT(8) |
-+ in[Y1 + 5*4] << SHIFT(0);
-+ y1 = in[Y0 + 6*4] << SHIFT(24) |
-+ in[Y1 + 6*4] << SHIFT(16) |
-+ in[Y0 + 7*4] << SHIFT(8) |
-+ in[Y1 + 7*4] << SHIFT(0);
-+
-+ ((u_int*)yp)[2] = y0;
-+ ((u_int*)yp)[3] = y1;
-+
-+ in += istride;
-+ yp += stride;
-+ }
-+}
-+
-+void MeteorCIFGrabber::saveblks(const u_char* in, int is)
-+{
-+ u_char* crv = crvec_;
-+ int off = framesize_;
-+ u_char* lum = frame_;
-+ u_char* chm = lum + off;
-+ off >>= 2;
-+
-+ crv += vstart_ * blkw_ + hstart_;
-+ lum += vstart_ * outw_ * 16 + hstart_ * 16;
-+ chm += vstart_ * (outw_ >> 1) * 8 + hstart_ * 8;
-+
-+ int skip = hstart_ + (blkw_ - hstop_);
-+
-+ for (int y = vstart_; y < vstop_; ++y) {
-+ const u_char* nin = in;
-+ for (int x = hstart_; x < hstop_; ++x) {
-+ int s = *crv++;
-+ if ((s & CR_SEND) != 0)
-+ saveblk(in, lum, chm, chm + off, outw_, is);
-+
-+ in += 32;
-+ lum += 16;
-+ chm += 8;
-+ }
-+ crv += skip;
-+ lum += 15 * outw_ + skip * 16;
-+ chm += 7 * (outw_ >> 1) + skip * 8;
-+ in = nin + 16 * is;
-+ }
- }