Skip to content

Commit

Permalink
CogVM source as per VMMaker.oscog-eem.3306
Browse files Browse the repository at this point in the history
Add support for mirroring a frame in the CameraPlugin.
Unimplemented on unix.
  • Loading branch information
eliotmiranda committed Feb 14, 2023
1 parent 6ee3b4f commit d51c1ac
Show file tree
Hide file tree
Showing 5 changed files with 265 additions and 134 deletions.
6 changes: 6 additions & 0 deletions platforms/Cross/plugins/CameraPlugin/CameraPlugin.h
Expand Up @@ -9,7 +9,13 @@ char *CameraName(sqInt cameraNum);
char *CameraUID(sqInt cameraNum);
sqInt CameraExtent(sqInt cameraNum);
sqInt CameraGetFrame(sqInt cameraNum, unsigned char *buf, sqInt pixelCount);

// CameraGet/SetParam names
#define FrameCount 1
#define FrameByteSize 2
#define MirrorImage 3
sqInt CameraGetParam(sqInt cameraNum, sqInt paramNum);
sqInt CameraSetParam(sqInt cameraNum, sqInt paramNum, sqInt paramValue);
sqInt CameraGetSemaphore(sqInt cameraNum);
sqInt CameraSetSemaphore(sqInt cameraNum, sqInt semaphoreIndex);
sqInt CameraSetFrameBuffers(sqInt cameraNum, sqInt bufferA, sqInt bufferBorNil);
Expand Down
49 changes: 41 additions & 8 deletions platforms/iOS/plugins/CameraPlugin/AVFoundationVideoGrabber.m
Expand Up @@ -110,6 +110,7 @@ @interface SqueakVideoGrabber : NSObject <AVCaptureVideoDataOutputSampleBufferDe
unsigned char errorCode;
unsigned char bInitCalled;
unsigned char useBNotA;
unsigned char mirrorImage;
}
@end

Expand Down Expand Up @@ -168,9 +169,19 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput
}
if (!errorCode) {
CVPixelBufferLockBaseAddress(imageBuffer, 0);
memcpy( theBuffer,
CVPixelBufferGetBaseAddress(imageBuffer),
currentWidth * currentHeight * 4);
if (mirrorImage) {
int *frame = CVPixelBufferGetBaseAddress(imageBuffer);
int *mirrored = theBuffer;
for (int y = 0; ++y <= currentHeight;) {
int *pixelp = frame + (y * currentWidth);
for (int x = currentWidth; --x >= 0;)
*mirrored++ = *--pixelp;
}
}
else
memcpy( theBuffer,
CVPixelBufferGetBaseAddress(imageBuffer),
currentWidth * currentHeight * 4);
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
if (theBuffer != pixels)
freshestBuffer = theBuffer;
Expand Down Expand Up @@ -355,6 +366,7 @@ -(SqueakVideoGrabber*)initCapture:(int)deviceNum
bInitCalled = YES;
frameCount = 0;
semaphoreIndex = -1;
mirrorImage = 0;
grabbers[deviceID] = self;
return self;
}
Expand Down Expand Up @@ -612,12 +624,33 @@ -(void)stopCapture: (sqInt)cameraNum {
sqInt
CameraGetParam(sqInt cameraNum, sqInt paramNum)
{
if (!CameraIsOpen(cameraNum)) return -1;
if (paramNum == 1) return grabbers[cameraNum-1]->frameCount;
if (paramNum == 2) return grabbers[cameraNum-1]->width
* grabbers[cameraNum-1]->height * 4;
if (!CameraIsOpen(cameraNum))
return -PrimErrNotFound;

SqueakVideoGrabber *grabber = grabbers[cameraNum-1];

switch (paramNum) {
case FrameCount: return grabber->frameCount;
case FrameByteSize: return grabber->width * grabber->height * 4;
case MirrorImage: return grabber->mirrorImage;
}
return -PrimErrBadArgument;
}

sqInt
CameraSetParam(sqInt cameraNum, sqInt paramNum, sqInt paramValue)
{
if (!CameraIsOpen(cameraNum))
return -PrimErrNotFound;

SqueakVideoGrabber *grabber = grabbers[cameraNum-1];

return -2;
if (paramNum == MirrorImage) {
sqInt oldValue = grabber->mirrorImage;
grabber->mirrorImage = paramValue;
return oldValue;
}
return -PrimErrBadArgument;
}

sqInt
Expand Down
36 changes: 27 additions & 9 deletions platforms/unix/plugins/CameraPlugin/sqCamera-linux.c
Expand Up @@ -117,6 +117,7 @@ struct camInfo_t {

unsigned long frameCount;
struct v4l2_capability cap;
unsigned char mirrorImage;
} camInfo[CAMERA_COUNT];

typedef struct camInfo_t *camPtr;
Expand Down Expand Up @@ -202,6 +203,7 @@ libCon(void)
cam->ioMethod = IO_METHOD_MMAP;
cam->nBuffers = 2;
cam->frameCount = 0;
cam->mirrorImage = 0;
cam->semaphoreIndex = -1;
vBufReset(&(cam->vBuf));
/* Pixel format auto selected for ease/speed of conversion */
Expand Down Expand Up @@ -774,19 +776,35 @@ initCamera(camPtr cam, int w, int h)


sqInt
CameraGetParam(sqInt camNum, sqInt paramNum)
CameraGetParam(sqInt cameraNum, sqInt paramNum)
{
camPtr cam = camera(camNum);

if (!cam) return -1;
if (paramNum == 1)
return cam->frameCount
? cam->frameCount
: (cameraReadable(cam) ? 1 : 0);
if (paramNum == 2)
return cam->bmWidth * cam->bmHeight * 4;
if (!cam)
return -PrimErrNotFound;
switch (paramNum) {
case FrameCount: return cam->frameCount;
case FrameByteSize: return cam->width * cam->height * 4;
case MirrorImage: return cam->mirrorImage;
}
return -PrimErrBadArgument;
}

return -2;
sqInt
CameraSetParam(sqInt cameraNum, sqInt paramNum, sqInt paramValue)
{
camPtr cam = camera(camNum);

if (!cam)
return -PrimErrNotFound;
if (paramNum == MirrorImage) {
sqInt oldValue = cam->mirrorImage;
if (1) // For now
return PrimErrUnsupported;
cam->mirrorImage = paramValue;
return oldValue;
}
return -PrimErrBadArgument;
}


Expand Down

0 comments on commit d51c1ac

Please sign in to comment.