This commit is contained in:
Mathias Westerdahl 2017-11-17 14:12:59 +01:00
commit 57ef591ca0
3 changed files with 61 additions and 61 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
};