📄 sgxcamera.cpp
字号:
/**
*** Class Name : SGXCamera
*** Version : 1.0.0
***
*** Author : Sophia Cradle Incorporated
*** Platform : x86, ARM
*** OS : BREW 2.1
*** Target SophiaFramework Version : 3.0
*** Compiler : Visual C++ 6.0, Visual C++ .NET 2003,
*** RVCTB 1.2
**/
#include "SGXCamera.hpp"
SGXCamera::SGXCamera(Void) : _camera(null), _bitmap(null), _previewable(false), _recordable(false), _spp(null)
{
_mediaData.clsData = MMD_FILE_NAME;
_mediaData.pData = static_cast<VoidPtr>("camera.jpg");
_mediaData.dwSize = 0;
_mimeType = static_cast<ACharPtr>("image/jpeg");
return;
}
SGXCamera::~SGXCamera(Void)
{
// 僨傿僗僩儔僋僞
Terminate();
return;
}
// rect : 僾儗價儏乕昞帵椞堟
// spp : 僐乕儖僶僢僋娭悢傊偺億僀儞僞
// reference : 僐乕儖僶僢僋娭悢傊搉偝傟傞僨乕僞傊偺億僀儞僞
SFCError SGXCamera::Initialize(SFXRectangleConstRef rect, NotifySPP spp, VoidPtr reference)
{
SFCError error(SFERR_NO_ERROR);
_bitmap = SFXGraphics::CreateBitmap(rect.GetSize()); // 僇儊儔夋憸曐帩梡價僢僩儅僢僾傪嶌惉偡傞
if (_bitmap != null) {
error = Resume(); // 僇儊儔偺婎杮揑側弨旛傪偡傞
if (error == SFERR_NO_ERROR) {
_rect = rect;
_spp = spp;
_reference = reference;
}
} else {
error = SFERR_NO_MEMORY; // 儊儌儕晄懌偺偨傔偵價僢僩儅僢僾偺嶌惉偑弌棃側偐偭偨
}
if (error != SFERR_NO_ERROR) {
Terminate();
}
return error;
}
// 僾儗價儏乕傪奐巒偡傞
SFCError SGXCamera::Preview(Void)
{
SFCError error(SFERR_NO_ERROR);
if (_camera != null) {
_status = STATUS_PREVIEW;
_previewable = false;
_recordable = false;
_toStop = false;
error = _camera->Preview(); // 僇儊儔傪僾儗價儏乕儌乕僪偱婲摦
} else {
error = SFERR_FAILED;
}
return error;
}
// 僗僫僢僾僔儑僢僩儌乕僪偱嶣塭偡傞
SFCError SGXCamera::Record(Void)
{
SFCError error(SFERR_NO_ERROR);
if (_camera != null) {
_previewable = false;
_recordable = false;
_status = STATUS_RECORD;
error = _camera->Stop(); // 僾儗價儏乕傪廔椆偡傞
// 僾儗價儏乕偑幚嵺偵廔椆偟偨帪揰偱僀儀儞僩僴儞僪儔偑屇偽傟傞偺偱丄
// 僗僫僢僾僔儑僢僩儌乕僪偱偺嶣塭偼偦偺拞偱峴偭偰偄傞
} else {
error = SFERR_FAILED;
}
return error;
}
// 僇儊儔偺廔椆張棟
Void SGXCamera::Suspend(Void)
{
if (_camera != null) {
_status = STATUS_STOP;
_previewable = false;
_recordable = false;
_toStop = true;
_camera->Stop();
}
return;
}
// 僇儊儔偺婎杮揑側弶婜壔張棟傪峴偆
SFCError SGXCamera::Resume(Void)
{
SFCError error(SFERR_NO_ERROR);
if ((_camera = SFBCamera::NewInstance()) != null) { // 僇儊儔偺僀儞僗僞儞僗傪庢摼
_previewable = true;
_recordable = false;
error = _camera->RegisterNotify(OnCameraSHP, this); // 僐乕儖僶僢僋僄儞僩儕傪搊榐
if (error == SFERR_NO_ERROR) {
AEESize size;
size.cx = PICTURE_WIDTH;
size.cy = PICTURE_HEIGHT;
error = _camera->SetSize(&size);
if (error == SFERR_NO_ERROR) {
error = _camera->SetDisplaySize(&size); // 僇儊儔偱庢摼偡傞夋憸偺僒僀僘傪愝掕
}
}
} else {
error = SFERR_NO_MEMORY; // 儊儌儕晄懌偺偨傔偵僇儊儔偺僀儞僗僞儞僗偑庢摼偱偒側偐偭偨
}
if (error != SFERR_NO_ERROR) {
Suspend();
}
return error;
}
// 僾儗價儏乕傪廔椆偟偰丄巊偭偨傝僜乕僗偺屻巒枛傪偡傞
Void SGXCamera::Terminate(Void)
{
Suspend();
if (_bitmap != null) {
_bitmap.Release(); // 嵟弶偵嶌惉偟偨價僢僩儅僢僾傪夝曻偡傞
}
return;
}
// 僗僫僢僾 僔儑僢僩嶣塭屻偺張棟
Void SGXCamera::AfterSnapshot(Void)
{
SFBBitmapSmp bitmap;
if (_camera->GetFrame(&bitmap) == SFERR_NO_ERROR) { // 僇儊儔偺夋憸傪價僢僩儅僢僾偲偟偰
_bitmap->BltIn(SFXRectangle(0, 0, _rect.GetSize()), bitmap, _rect.GetOrigin()); // 僇儊儔偺夋憸偐傜巜掕偟偨僒僀僘暘偩偗敳偒弌偡
}
_previewable = true;
_spp(_status, SFERR_NO_ERROR, _reference);
}
// 僐乕儖僶僢僋僴儞僪儔(僟儈乕)
Void OnCameraSHP(VoidPtr reference, AEECameraNotify *notify)
{
SGXCameraPtr(reference)->OnCamera(notify); // 僐乕儖僶僢僋僴儞僪儔偺幚懱傪屇傃弌偡
return;
}
// 僐乕儖僶僢僋僴儞僪儔(幚懱)
Void SGXCamera::OnCamera(AEECameraNotify *notify)
{
switch (notify->nStatus) {
case CAM_STATUS_START: // 僇儊儔偺婲摦偑姰椆偟偨
if (_status == STATUS_PREVIEW) {
_recordable = true;
_spp(_status, SFERR_NO_ERROR, _reference);
}
break;
case CAM_STATUS_FRAME: // 怴偨側僼儗乕儉傪庢摼偟偨
if (_status == STATUS_PREVIEW) {
SFBBitmapSmp bitmap;
if (_camera->GetFrame(&bitmap) == SFERR_NO_ERROR) { // 僇儊儔偺夋憸傪價僢僩儅僢僾偲偟偰庢摼偡傞
_bitmap->BltIn(SFXRectangle(0, 0, _rect.GetSize()), bitmap, _rect.GetOrigin()); // 僇儊儔偺夋憸偐傜夋柺昞帵椞堟傪敳偒弌偡
}
_spp(STATUS_FRAME, SFERR_NO_ERROR, _reference);
if (!_toStop) {
SFXGraphicsPtr pg = SFXGraphics::GetInstance();
pg->BitBlt(_rect, _bitmap, SFXGrid(0, 0)); // 庢摼偟偨夋憸傪夋柺偵昞帵偡傞
pg->Update(); // 夋柺傪峏怴
}
else {
_toStop = false;
}
}
break;
case CAM_STATUS_DONE: // 張棟偑姰椆偟偨
if (_status == STATUS_RECORD) {
_status = STATUS_ENCODE;
_camera->DeferEncode(true); // 抶墑僄儞僐乕僪儌乕僪偵愝掕
_camera->SetMediaData(&_mediaData, _mimeType);
_camera->RecordSnapshot(); // 僗僫僢僾僔儑僢僩儌乕僪偱嶣塭偡傞
} else if (_status == STATUS_ENCODE) {
AfterSnapshot();
} else if (_status == STATUS_STOP) {
_camera.Release();
_spp(_status, SFERR_NO_ERROR, _reference);
}
break;
case CAM_STATUS_FAIL:
case CAM_STATUS_ABORT:
_spp(_status, EFAILED, _reference);
break;
}
return;
}
// 尰嵼偺柧傞偝傪庢摼偡傞
SInt16 SGXCamera::GetBrightness(Void) const
{
SInt16 result(0);
if (_camera != null) {
SInt32 value;
AEEParmInfo info;
if (_camera->GetParm(CAM_PARM_BRIGHTNESS, &value, (SInt32Ptr)&info) == SFERR_NO_ERROR) { // 柧傞偝傪庢摼
result = (SInt16)value;
}
}
return result;
}
// 巜掕偱偒傞柧傞偝偺斖埻傪庢摼偡傞
Bool SGXCamera::GetBrightnessRange(SInt16Ptr minimum, SInt16Ptr maximum) const
{
Bool result(false);
*minimum = *maximum = 0;
if (_camera != null) {
Bool support;
if (_camera->IsBrightness(&support) == SFERR_NO_ERROR) {
if (support) {
SInt32 value;
AEEParmInfo info;
if (_camera->GetParm(CAM_PARM_BRIGHTNESS, &value, (SInt32Ptr)&info) == SFERR_NO_ERROR) { // 斖埻傪庢摼
*minimum = (SInt16)info.nMin;
*maximum = (SInt16)info.nMax;
result = true;
}
}
}
}
return result;
}
// 柧傞偝傪巜掕偡傞
Void SGXCamera::SetBrightness(SInt16 value)
{
if (_camera != null) {
if (_recordable) {
_camera->SetBrightness(value); // 柧傞偝傪巜掕
}
}
}
// 尰嵼偺僘乕儉抣傪庢摼偡傞
SInt16 SGXCamera::GetZoom(Void) const
{
SInt16 result(0);
if (_camera != null) {
SInt32 value;
AEEParmInfo info;
if (_camera->GetParm(CAM_PARM_ZOOM, &value, (SInt32Ptr)&info) == SFERR_NO_ERROR) { // 僘乕儉抣傪庢摼
result = (SInt16)value;
}
}
return result;
}
// 巜掕偱偒傞僇儊儔抣偺斖埻傪庢摼偡傞
Bool SGXCamera::GetZoomRange(SInt16Ptr minimum, SInt16Ptr maximum) const
{
Bool result(false);
*minimum = *maximum = 0;
if (_camera != null) {
Bool support;
if (_camera->IsZoom(&support) == SFERR_NO_ERROR) {
if (support) {
SInt32 value;
AEEParmInfo info;
if (_camera->GetParm(CAM_PARM_ZOOM, &value, (SInt32Ptr)&info) == SFERR_NO_ERROR) { // 斖埻傪庢摼
*minimum = (SInt16)info.nMin;
*maximum = (SInt16)info.nMax;
result = true;
}
}
}
}
return result;
}
// 僘乕儉抣傪愝掕偡傞
Void SGXCamera::SetZoom(SInt16 value)
{
if (_camera != null) {
if (_recordable) {
_camera->SetZoom(value); // 僘乕儉抣傪巜掕
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -