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); CameraType type = (CameraType) luaL_checkint(L, 1);
CaptureQuality quality = (CaptureQuality)luaL_checkint(L, 2); 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); lua_pushboolean(L, status > 0);
if( status == 0 ) if( status == 0 )
{ {
dmLogError("capture failed!\n"); dmLogError("capture failed!\n");
return 1; return 1;
} }
// Increase ref count // Increase ref count
dmScript::LuaHBuffer luabuffer = {g_DefoldCamera.m_VideoBuffer, false}; dmScript::LuaHBuffer luabuffer = {g_DefoldCamera.m_VideoBuffer, false};
dmScript::PushBuffer(L, luabuffer); dmScript::PushBuffer(L, luabuffer);
g_DefoldCamera.m_VideoBufferLuaRef = dmScript::Ref(L, LUA_REGISTRYINDEX); g_DefoldCamera.m_VideoBufferLuaRef = dmScript::Ref(L, LUA_REGISTRYINDEX);
return 1; return 1;
} }
static int StopCapture(lua_State* L) static int StopCapture(lua_State* L)
{ {
DM_LUA_STACK_CHECK(L, 0); DM_LUA_STACK_CHECK(L, 0);
int status = CameraPlatform_StopCapture(); int status = CameraPlatform_StopCapture();
if( !status ) if( !status )
{ {
return luaL_error(L, "Failed to stop capture. Was it started?"); 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 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> @interface CameraCaptureDelegate : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate>
{ {
@private AVCaptureSession* m_captureSession; @private AVCaptureSession* m_captureSession;
@private AVCaptureDevice* m_camera; @private AVCaptureDevice* m_camera;
@private AVCaptureDeviceInput* m_cameraInput; @private AVCaptureDeviceInput* m_cameraInput;
@private AVCaptureVideoDataOutput* m_videoOutput; @private AVCaptureVideoDataOutput* m_videoOutput;
@public CMVideoDimensions m_Size; @public CMVideoDimensions m_Size;
} }
@end @end
struct IOSCamera struct IOSCamera
{ {
CameraCaptureDelegate* m_Delegate; CameraCaptureDelegate* m_Delegate;
dmBuffer::HBuffer m_VideoBuffer; dmBuffer::HBuffer m_VideoBuffer;
// TODO: Support audio buffers // TODO: Support audio buffers
IOSCamera() : m_Delegate(0), m_VideoBuffer(0) IOSCamera() : m_Delegate(0), m_VideoBuffer(0)
{ {
} }
}; };
IOSCamera g_Camera; IOSCamera g_Camera;
@ -76,31 +76,31 @@ IOSCamera g_Camera;
{ {
if( captureOutput == m_videoOutput && g_Camera.m_VideoBuffer != 0 ) if( captureOutput == m_videoOutput && g_Camera.m_VideoBuffer != 0 )
{ {
uint8_t* data = 0; uint8_t* data = 0;
uint32_t datasize = 0; uint32_t datasize = 0;
dmBuffer::GetBytes(g_Camera.m_VideoBuffer, (void**)&data, &datasize); dmBuffer::GetBytes(g_Camera.m_VideoBuffer, (void**)&data, &datasize);
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0); CVPixelBufferLockBaseAddress(imageBuffer,0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer); size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(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); //printf("img width/height: %d, %d\n", width, height);
CVPixelBufferUnlockBaseAddress(imageBuffer, 0); CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
return; return;
} }
uint8_t* pixels = (uint8_t*)CVPixelBufferGetBaseAddress(imageBuffer); uint8_t* pixels = (uint8_t*)CVPixelBufferGetBaseAddress(imageBuffer);
for( int y = 0; y < height; ++y ) for( int y = 0; y < height; ++y )
{ {
for( int x = 0; x < width; ++x ) for( int x = 0; x < width; ++x )
{ {
// RGB < BGR(A) // RGB < BGR(A)
#if defined(DM_PLATFORM_IOS) #if defined(DM_PLATFORM_IOS)
// Flip Y // Flip Y
data[y*width*3 + x*3 + 2] = pixels[(height - y - 1) * bytesPerRow + x * 4 + 0]; 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]; data[y*width*3 + x*3 + 0] = pixels[(height - y - 1) * bytesPerRow + bytesPerRow - (x+1) * 4 + 2];
#endif #endif
} }
} }
CVPixelBufferUnlockBaseAddress(imageBuffer, 0); CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
dmBuffer::ValidateBuffer(g_Camera.m_VideoBuffer); dmBuffer::ValidateBuffer(g_Camera.m_VideoBuffer);
} }
} }
- (void)captureOutput:(AVCaptureOutput *)captureOutput - (void)captureOutput:(AVCaptureOutput *)captureOutput
@ -126,7 +126,7 @@ IOSCamera g_Camera;
fromConnection:(AVCaptureConnection *)connection 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) int CameraPlatform_StartCapture(dmBuffer::HBuffer* buffer, CameraType type, CaptureQuality quality, CameraInfo& outparams)
{ {
if(g_Camera.m_Delegate == 0) if(g_Camera.m_Delegate == 0)
{ {
g_Camera.m_Delegate = [[CameraCaptureDelegate alloc] init]; g_Camera.m_Delegate = [[CameraCaptureDelegate alloc] init];
} }
AVCaptureDevicePosition cameraposition = AVCaptureDevicePositionUnspecified; AVCaptureDevicePosition cameraposition = AVCaptureDevicePositionUnspecified;
#if defined(DM_PLATFORM_IOS) #if defined(DM_PLATFORM_IOS)
@ -367,7 +367,7 @@ int CameraPlatform_StartCapture(dmBuffer::HBuffer* buffer, CameraType type, Capt
cameraposition = AVCaptureDevicePositionFront; cameraposition = AVCaptureDevicePositionFront;
#endif #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_Width = (uint32_t)g_Camera.m_Delegate->m_Size.width;
outparams.m_Height = (uint32_t)g_Camera.m_Delegate->m_Size.height; 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() int CameraPlatform_StopCapture()
{ {
if(g_Camera.m_Delegate != 0) if(g_Camera.m_Delegate != 0)
{ {
[g_Camera.m_Delegate stopCamera]; [g_Camera.m_Delegate stopCamera];
[g_Camera.m_Delegate release]; [g_Camera.m_Delegate release];
g_Camera.m_Delegate = 0; g_Camera.m_Delegate = 0;
dmBuffer::Destroy(g_Camera.m_VideoBuffer); dmBuffer::Destroy(g_Camera.m_VideoBuffer);
g_Camera.m_VideoBuffer = 0; g_Camera.m_VideoBuffer = 0;
} }
return 1; return 1;
} }
#endif // DM_PLATFORM_IOS/DM_PLATFORM_OSX #endif // DM_PLATFORM_IOS/DM_PLATFORM_OSX

View File

@ -4,21 +4,21 @@
enum CaptureQuality enum CaptureQuality
{ {
CAPTURE_QUALITY_LOW, CAPTURE_QUALITY_LOW,
CAPTURE_QUALITY_MEDIUM, CAPTURE_QUALITY_MEDIUM,
CAPTURE_QUALITY_HIGH, CAPTURE_QUALITY_HIGH,
}; };
enum CameraType enum CameraType
{ {
CAMERA_TYPE_FRONT, // Selfie CAMERA_TYPE_FRONT, // Selfie
CAMERA_TYPE_BACK CAMERA_TYPE_BACK
}; };
struct CameraInfo struct CameraInfo
{ {
uint32_t m_Width; uint32_t m_Width;
uint32_t m_Height; uint32_t m_Height;
CameraType m_Type; CameraType m_Type;
}; };