mirror of
https://github.com/defold/extension-camera
synced 2025-06-27 10:27:45 +02:00
Merge branch 'master' of https://github.com/defold/extension-camera
This commit is contained in:
commit
57ef591ca0
@ -38,32 +38,32 @@ static int StartCapture(lua_State* L)
|
||||
CameraType type = (CameraType) luaL_checkint(L, 1);
|
||||
CaptureQuality quality = (CaptureQuality)luaL_checkint(L, 2);
|
||||
|
||||
int status = CameraPlatform_StartCapture(&g_DefoldCamera.m_VideoBuffer, type, quality, g_DefoldCamera.m_Params);
|
||||
int status = CameraPlatform_StartCapture(&g_DefoldCamera.m_VideoBuffer, type, quality, g_DefoldCamera.m_Params);
|
||||
|
||||
lua_pushboolean(L, status > 0);
|
||||
if( status == 0 )
|
||||
{
|
||||
lua_pushboolean(L, status > 0);
|
||||
if( status == 0 )
|
||||
{
|
||||
dmLogError("capture failed!\n");
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Increase ref count
|
||||
dmScript::LuaHBuffer luabuffer = {g_DefoldCamera.m_VideoBuffer, false};
|
||||
dmScript::PushBuffer(L, luabuffer);
|
||||
g_DefoldCamera.m_VideoBufferLuaRef = dmScript::Ref(L, LUA_REGISTRYINDEX);
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int StopCapture(lua_State* L)
|
||||
{
|
||||
DM_LUA_STACK_CHECK(L, 0);
|
||||
|
||||
int status = CameraPlatform_StopCapture();
|
||||
if( !status )
|
||||
{
|
||||
int status = CameraPlatform_StopCapture();
|
||||
if( !status )
|
||||
{
|
||||
return luaL_error(L, "Failed to stop capture. Was it started?");
|
||||
}
|
||||
}
|
||||
|
||||
dmScript::Unref(L, LUA_REGISTRYINDEX, g_DefoldCamera.m_VideoBufferLuaRef); // We want it destroyed by the GC
|
||||
|
||||
|
@ -18,23 +18,23 @@
|
||||
|
||||
@interface CameraCaptureDelegate : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate>
|
||||
{
|
||||
@private AVCaptureSession* m_captureSession;
|
||||
@private AVCaptureDevice* m_camera;
|
||||
@private AVCaptureDeviceInput* m_cameraInput;
|
||||
@private AVCaptureVideoDataOutput* m_videoOutput;
|
||||
@public CMVideoDimensions m_Size;
|
||||
@private AVCaptureSession* m_captureSession;
|
||||
@private AVCaptureDevice* m_camera;
|
||||
@private AVCaptureDeviceInput* m_cameraInput;
|
||||
@private AVCaptureVideoDataOutput* m_videoOutput;
|
||||
@public CMVideoDimensions m_Size;
|
||||
}
|
||||
@end
|
||||
|
||||
struct IOSCamera
|
||||
{
|
||||
CameraCaptureDelegate* m_Delegate;
|
||||
dmBuffer::HBuffer m_VideoBuffer;
|
||||
// TODO: Support audio buffers
|
||||
CameraCaptureDelegate* m_Delegate;
|
||||
dmBuffer::HBuffer m_VideoBuffer;
|
||||
// TODO: Support audio buffers
|
||||
|
||||
IOSCamera() : m_Delegate(0), m_VideoBuffer(0)
|
||||
{
|
||||
}
|
||||
IOSCamera() : m_Delegate(0), m_VideoBuffer(0)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
IOSCamera g_Camera;
|
||||
@ -76,31 +76,31 @@ IOSCamera g_Camera;
|
||||
{
|
||||
if( captureOutput == m_videoOutput && g_Camera.m_VideoBuffer != 0 )
|
||||
{
|
||||
uint8_t* data = 0;
|
||||
uint32_t datasize = 0;
|
||||
dmBuffer::GetBytes(g_Camera.m_VideoBuffer, (void**)&data, &datasize);
|
||||
uint8_t* data = 0;
|
||||
uint32_t datasize = 0;
|
||||
dmBuffer::GetBytes(g_Camera.m_VideoBuffer, (void**)&data, &datasize);
|
||||
|
||||
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
|
||||
CVPixelBufferLockBaseAddress(imageBuffer,0);
|
||||
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
|
||||
CVPixelBufferLockBaseAddress(imageBuffer,0);
|
||||
|
||||
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
|
||||
size_t width = CVPixelBufferGetWidth(imageBuffer);
|
||||
size_t height = CVPixelBufferGetHeight(imageBuffer);
|
||||
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
|
||||
size_t width = CVPixelBufferGetWidth(imageBuffer);
|
||||
size_t height = CVPixelBufferGetHeight(imageBuffer);
|
||||
|
||||
if( width != g_Camera.m_Delegate->m_Size.width || height != g_Camera.m_Delegate->m_Size.height )
|
||||
{
|
||||
if( width != g_Camera.m_Delegate->m_Size.width || height != g_Camera.m_Delegate->m_Size.height )
|
||||
{
|
||||
//printf("img width/height: %d, %d\n", width, height);
|
||||
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t* pixels = (uint8_t*)CVPixelBufferGetBaseAddress(imageBuffer);
|
||||
uint8_t* pixels = (uint8_t*)CVPixelBufferGetBaseAddress(imageBuffer);
|
||||
|
||||
for( int y = 0; y < height; ++y )
|
||||
{
|
||||
for( int x = 0; x < width; ++x )
|
||||
{
|
||||
// RGB < BGR(A)
|
||||
for( int y = 0; y < height; ++y )
|
||||
{
|
||||
for( int x = 0; x < width; ++x )
|
||||
{
|
||||
// RGB < BGR(A)
|
||||
#if defined(DM_PLATFORM_IOS)
|
||||
// Flip Y
|
||||
data[y*width*3 + x*3 + 2] = pixels[(height - y - 1) * bytesPerRow + x * 4 + 0];
|
||||
@ -113,12 +113,12 @@ IOSCamera g_Camera;
|
||||
data[y*width*3 + x*3 + 0] = pixels[(height - y - 1) * bytesPerRow + bytesPerRow - (x+1) * 4 + 2];
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
|
||||
dmBuffer::ValidateBuffer(g_Camera.m_VideoBuffer);
|
||||
}
|
||||
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
|
||||
dmBuffer::ValidateBuffer(g_Camera.m_VideoBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)captureOutput:(AVCaptureOutput *)captureOutput
|
||||
@ -126,7 +126,7 @@ IOSCamera g_Camera;
|
||||
fromConnection:(AVCaptureConnection *)connection
|
||||
{
|
||||
|
||||
//NSLog(@"DROPPING FRAME!!!");
|
||||
//NSLog(@"DROPPING FRAME!!!");
|
||||
}
|
||||
|
||||
|
||||
@ -354,10 +354,10 @@ static CMVideoDimensions FlipCoords(AVCaptureVideoDataOutput* output, const CMVi
|
||||
|
||||
int CameraPlatform_StartCapture(dmBuffer::HBuffer* buffer, CameraType type, CaptureQuality quality, CameraInfo& outparams)
|
||||
{
|
||||
if(g_Camera.m_Delegate == 0)
|
||||
{
|
||||
g_Camera.m_Delegate = [[CameraCaptureDelegate alloc] init];
|
||||
}
|
||||
if(g_Camera.m_Delegate == 0)
|
||||
{
|
||||
g_Camera.m_Delegate = [[CameraCaptureDelegate alloc] init];
|
||||
}
|
||||
|
||||
AVCaptureDevicePosition cameraposition = AVCaptureDevicePositionUnspecified;
|
||||
#if defined(DM_PLATFORM_IOS)
|
||||
@ -367,7 +367,7 @@ int CameraPlatform_StartCapture(dmBuffer::HBuffer* buffer, CameraType type, Capt
|
||||
cameraposition = AVCaptureDevicePositionFront;
|
||||
#endif
|
||||
|
||||
BOOL started = [g_Camera.m_Delegate startCamera: cameraposition quality: quality];
|
||||
BOOL started = [g_Camera.m_Delegate startCamera: cameraposition quality: quality];
|
||||
|
||||
outparams.m_Width = (uint32_t)g_Camera.m_Delegate->m_Size.width;
|
||||
outparams.m_Height = (uint32_t)g_Camera.m_Delegate->m_Size.height;
|
||||
@ -386,16 +386,16 @@ int CameraPlatform_StartCapture(dmBuffer::HBuffer* buffer, CameraType type, Capt
|
||||
|
||||
int CameraPlatform_StopCapture()
|
||||
{
|
||||
if(g_Camera.m_Delegate != 0)
|
||||
{
|
||||
if(g_Camera.m_Delegate != 0)
|
||||
{
|
||||
[g_Camera.m_Delegate stopCamera];
|
||||
[g_Camera.m_Delegate release];
|
||||
g_Camera.m_Delegate = 0;
|
||||
|
||||
dmBuffer::Destroy(g_Camera.m_VideoBuffer);
|
||||
g_Camera.m_VideoBuffer = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif // DM_PLATFORM_IOS/DM_PLATFORM_OSX
|
||||
|
@ -4,21 +4,21 @@
|
||||
|
||||
enum CaptureQuality
|
||||
{
|
||||
CAPTURE_QUALITY_LOW,
|
||||
CAPTURE_QUALITY_MEDIUM,
|
||||
CAPTURE_QUALITY_HIGH,
|
||||
CAPTURE_QUALITY_LOW,
|
||||
CAPTURE_QUALITY_MEDIUM,
|
||||
CAPTURE_QUALITY_HIGH,
|
||||
};
|
||||
|
||||
enum CameraType
|
||||
{
|
||||
CAMERA_TYPE_FRONT, // Selfie
|
||||
CAMERA_TYPE_BACK
|
||||
CAMERA_TYPE_FRONT, // Selfie
|
||||
CAMERA_TYPE_BACK
|
||||
};
|
||||
|
||||
struct CameraInfo
|
||||
{
|
||||
uint32_t m_Width;
|
||||
uint32_t m_Height;
|
||||
uint32_t m_Width;
|
||||
uint32_t m_Height;
|
||||
CameraType m_Type;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user