Files
palemoon27/dom/camera/TestGonkCameraHardware.cpp
T
roytam1 4ac9bef80d import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 936092, initial DnD support for e10s, r=enndeakin,karlt (3cde556cf)
- Bug 1152066 - Remove ugly dynamic loading code now that we can assume this symbol exists. r=roc (04813dd18)
- Bug 966395 - Correctly propagate the input language's direction on OSX. r=masayuki/mrbkap (14a21fa0c)
- Bug 1158791 - Try harder to avoid Gtk-Critical errors in xpcshell tests. r=karlt (f6cec3b99)
- Bug 1153922 - Add a SandboxOptions option for creating the sandbox in a fresh JS::Zone. r=mrbkap (f99b17726)
- Bug 968520 - Always use fallible allocator with nsTArray_base::ShrinkCapacity. r=froydnj (b7cf63063)
- Bug 1160027 - Move ResourceQueue implementation from header file - r=cpearce (5fabd8c8f)
- Bug 1119277 - Remove the process CPU priority parameter and simplify all the associated code. r=khuey, r=dhylands (32d2b0df2)
- Goanna -> Gecko (2b16bec4c)
- Bug 892371 - Adjust oom_score_adj values for foreground processes according to an LRU policy. r=dhylands, r=khuey (61cdfc3db)
- Bug 892371 - Add mochitests covering LRU priority adjustments for both foreground and background processes. r=khuey (46676e34f)
- Bug 1164297 - tweaks to logging modules of MediaDecoderStateMachine to remove accessing to env vars. r=cpearce. (e9dc910da)
- Bug 1150539: log getUserMedia constraints used in MediaManager:5. r=jesup (161853b66)
- Bug 1139027 - Permit running of camera mochitests on B2G desktop. r=mikeh (8bb265db2)
- Bug 1145403 - Don't open MediaManager on shutdown. r=jesup (9338eef82)
- Bug 1046245 - enumerateDevices w/non-blocking e10s, nsICryptoHMAC, clear cookies, lambdas. r=keeler, florian, billm, jesup (ce9d684a0)
- remove StopWebRtcLoc() to be readded in Bug 1219339 - Part2 (7a0c901fc)
- Bug 1046245 - IO on STS thread + cleanup BackgroundChild on shutdown r=jesup (e85dd7716)
- Bug 579517 follow-up: Remove NSPR types that crept in (35aee15a6)
- Bug 1152443 - Fix broken validation which prevented reading of enumerate_devices.txt. r=jesup (4e135355b)
- Bug 1143562 - use /data/b2g/mozilla/gmp as the gmp storage folder on B2G. r=cpearce. (ddc07f09a)
- Bug 1143562. Part2 - only init |mStorageBaseDir| in the chrome process. r=cpearce (3039a4f44)
- remove specific hack, this code is going away anyway (34aed4d6b)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 0 - Make mozIGeckoMediaPluginService::GetPluginVersionForAPI return whether we even have the plugin. r=cpearce. (e6ac61630)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 1 - split GeckoMediaPluginService into a part for chrome and a part for both content and chrome. r=jwwang. (09f8c4a83)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 2 - support asynchronous GMP API getters. r=jwwang,rjesup. (e33266976)
- Bug 1143532 - Include pid in the log messages of GMPParent. r=edwin (8486ebc50)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 3 - split the GMP IPDL actors in 2 parts (and use opens to open the second in non-e10s). r=billm. (d17fa36ff)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 4 - make GetNodeId asynchronous. r=jwwang. (db7a21e4a)
- Bug 1150049 - tidy up nsImageBoxFrame::Init a little bit; r=dholbert (41c258a71)
- Bug 1150266 - fix IPDL thinko for never-inline method declarations; r=bent (445d3420b)
- Bug 1150207 - Convert a focus() call to use SpecialPowers to avoid out-of-order focusing behaviour. r=mwargers (4d134848c)
- Bug 1148641 - Guard against null parameters to SendSetTargetAPZCNotification. r=botond (8c5f4bb6d)
- Bug 1096172 - Fix position reporting of bad charrefs in RCDATA. r=hsivonen. (77100d26d)
- Bug 1149971 Part 2: Cet rid of kCurrentProcessId as it makes lots of static initializers. r=dvander (3efaefdba)
- remove android widgets (0c2565418)
- Bug 1129991 - Remove QuotaManager::SetCurrentWindow(); r=bent (7ccabf88c)
- Bug 1133748 - Fix ipdl code for bridged protocols that are also opened. r=billm. (402751d09)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 5 - use bridging for GMP in e10s. r=billm. (e45a87c5f)
- Bug 1057908 followup: Add missing 'override' annotation on GMPServiceParent::ActorDestroy method decl. rs=ehsan (48f53b28a)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Add nsServiceManagerUtils.h include to WMFDecoderModule.cpp. (67cddb4da)
- kill android widgets better (bec243c8d)
2020-05-30 12:49:01 +08:00

727 lines
18 KiB
C++

/*
* Copyright (C) 2013-2015 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "TestGonkCameraHardware.h"
#include "CameraPreferences.h"
#include "nsThreadUtils.h"
#include "mozilla/dom/EventListenerBinding.h"
#include "mozilla/dom/BlobEvent.h"
#include "mozilla/dom/ErrorEvent.h"
#include "mozilla/dom/CameraFacesDetectedEvent.h"
#include "mozilla/dom/CameraStateChangeEvent.h"
#include "DOMCameraDetectedFace.h"
#include "nsNetUtil.h"
#include "nsServiceManagerUtils.h"
#include "nsICameraTestHardware.h"
using namespace android;
using namespace mozilla;
using namespace mozilla::dom;
#ifndef MOZ_WIDGET_GONK
NS_IMPL_ISUPPORTS_INHERITED0(TestGonkCameraHardware, GonkCameraHardware);
#endif
static void
CopyFaceFeature(int32_t (&aDst)[2], bool aExists, const DOMPoint* aSrc)
{
if (aExists && aSrc) {
aDst[0] = static_cast<int32_t>(aSrc->X());
aDst[1] = static_cast<int32_t>(aSrc->Y());
} else {
aDst[0] = -2000;
aDst[1] = -2000;
}
}
class TestGonkCameraHardwareListener : public nsIDOMEventListener
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMEVENTLISTENER
TestGonkCameraHardwareListener(nsGonkCameraControl* aTarget, nsIThread* aCameraThread)
: mTarget(aTarget)
, mCameraThread(aCameraThread)
{
MOZ_COUNT_CTOR(TestGonkCameraHardwareListener);
}
protected:
virtual ~TestGonkCameraHardwareListener()
{
MOZ_COUNT_DTOR(TestGonkCameraHardwareListener);
}
nsRefPtr<nsGonkCameraControl> mTarget;
nsCOMPtr<nsIThread> mCameraThread;
};
NS_IMETHODIMP
TestGonkCameraHardwareListener::HandleEvent(nsIDOMEvent* aEvent)
{
nsString eventType;
aEvent->GetType(eventType);
DOM_CAMERA_LOGI("Inject '%s' event",
NS_ConvertUTF16toUTF8(eventType).get());
if (eventType.EqualsLiteral("focus")) {
CameraStateChangeEvent* event = aEvent->InternalDOMEvent()->AsCameraStateChangeEvent();
if (!NS_WARN_IF(!event)) {
nsString state;
event->GetNewState(state);
if (state.EqualsLiteral("focused")) {
OnAutoFocusComplete(mTarget, true);
} else if (state.EqualsLiteral("unfocused")) {
OnAutoFocusComplete(mTarget, false);
} else if (state.EqualsLiteral("focusing")) {
OnAutoFocusMoving(mTarget, true);
} else if (state.EqualsLiteral("not_focusing")) {
OnAutoFocusMoving(mTarget, false);
} else {
DOM_CAMERA_LOGE("Unhandled focus state '%s'\n",
NS_ConvertUTF16toUTF8(state).get());
}
}
} else if (eventType.EqualsLiteral("shutter")) {
DOM_CAMERA_LOGI("Inject shutter event");
OnShutter(mTarget);
} else if (eventType.EqualsLiteral("picture")) {
BlobEvent* event = aEvent->InternalDOMEvent()->AsBlobEvent();
if (!NS_WARN_IF(!event)) {
File* file = event->GetData();
if (file) {
static const uint64_t MAX_FILE_SIZE = 2147483647;
uint64_t dataLength = 0;
nsresult rv = file->GetSize(&dataLength);
if (NS_WARN_IF(NS_FAILED(rv) || dataLength > MAX_FILE_SIZE)) {
return NS_OK;
}
nsCOMPtr<nsIInputStream> inputStream;
rv = file->GetInternalStream(getter_AddRefs(inputStream));
if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_OK;
}
uint8_t* data = new uint8_t[dataLength];
rv = NS_ReadInputStreamToBuffer(inputStream,
reinterpret_cast<void**>(&data),
static_cast<uint32_t>(dataLength));
if (NS_WARN_IF(NS_FAILED(rv))) {
delete [] data;
return NS_OK;
}
OnTakePictureComplete(mTarget, data, dataLength);
delete [] data;
} else {
OnTakePictureComplete(mTarget, nullptr, 0);
}
}
} else if(eventType.EqualsLiteral("error")) {
ErrorEvent* event = aEvent->InternalDOMEvent()->AsErrorEvent();
if (!NS_WARN_IF(!event)) {
nsString errorType;
event->GetMessage(errorType);
if (errorType.EqualsLiteral("picture")) {
OnTakePictureError(mTarget);
} else if (errorType.EqualsLiteral("system")) {
if (!NS_WARN_IF(!mCameraThread)) {
class DeferredSystemFailure : public nsRunnable
{
public:
DeferredSystemFailure(nsGonkCameraControl* aTarget)
: mTarget(aTarget)
{ }
NS_IMETHODIMP
Run()
{
OnSystemError(mTarget, CameraControlListener::kSystemService, 100, 0);
return NS_OK;
}
protected:
nsRefPtr<nsGonkCameraControl> mTarget;
};
mCameraThread->Dispatch(new DeferredSystemFailure(mTarget), NS_DISPATCH_NORMAL);
}
} else {
DOM_CAMERA_LOGE("Unhandled error event type '%s'\n",
NS_ConvertUTF16toUTF8(errorType).get());
}
}
} else if(eventType.EqualsLiteral("facesdetected")) {
CameraFacesDetectedEvent* event = aEvent->InternalDOMEvent()->AsCameraFacesDetectedEvent();
if (!NS_WARN_IF(!event)) {
Nullable<nsTArray<nsRefPtr<DOMCameraDetectedFace>>> faces;
event->GetFaces(faces);
camera_frame_metadata_t metadata;
memset(&metadata, 0, sizeof(metadata));
if (faces.IsNull()) {
OnFacesDetected(mTarget, &metadata);
} else {
const nsTArray<nsRefPtr<DOMCameraDetectedFace>>& facesData = faces.Value();
uint32_t i = facesData.Length();
metadata.number_of_faces = i;
metadata.faces = new camera_face_t[i];
memset(metadata.faces, 0, sizeof(camera_face_t) * i);
while (i > 0) {
--i;
const nsRefPtr<DOMCameraDetectedFace>& face = facesData[i];
camera_face_t& f = metadata.faces[i];
const DOMRect& bounds = *face->Bounds();
f.rect[0] = static_cast<int32_t>(bounds.Left());
f.rect[1] = static_cast<int32_t>(bounds.Top());
f.rect[2] = static_cast<int32_t>(bounds.Right());
f.rect[3] = static_cast<int32_t>(bounds.Bottom());
CopyFaceFeature(f.left_eye, face->HasLeftEye(), face->GetLeftEye());
CopyFaceFeature(f.right_eye, face->HasRightEye(), face->GetRightEye());
CopyFaceFeature(f.mouth, face->HasMouth(), face->GetMouth());
f.id = face->Id();
f.score = face->Score();
}
OnFacesDetected(mTarget, &metadata);
delete [] metadata.faces;
}
}
} else {
DOM_CAMERA_LOGE("Unhandled injected event '%s'",
NS_ConvertUTF16toUTF8(eventType).get());
}
return NS_OK;
}
NS_IMPL_ISUPPORTS(TestGonkCameraHardwareListener, nsIDOMEventListener)
class TestGonkCameraHardware::ControlMessage : public nsRunnable
{
public:
ControlMessage(TestGonkCameraHardware* aTestHw)
: mTestHw(aTestHw)
{ }
NS_IMETHOD
Run() override
{
if (NS_WARN_IF(!mTestHw)) {
return NS_ERROR_INVALID_ARG;
}
MutexAutoLock lock(mTestHw->mMutex);
mTestHw->mStatus = RunInline();
nsresult rv = mTestHw->mCondVar.Notify();
NS_WARN_IF(NS_FAILED(rv));
return NS_OK;
}
nsresult
RunInline()
{
if (NS_WARN_IF(!mTestHw)) {
return NS_ERROR_INVALID_ARG;
}
nsresult rv;
mJSTestWrapper = do_GetService("@mozilla.org/cameratesthardware;1", &rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
DOM_CAMERA_LOGE("Cannot get camera test service\n");
return rv;
}
rv = RunImpl();
mJSTestWrapper = nullptr;
return rv;
}
protected:
NS_IMETHOD RunImpl() = 0;
virtual ~ControlMessage() { }
nsCOMPtr<nsICameraTestHardware> mJSTestWrapper;
/* Since we block the control thread until we have finished
processing the request on the main thread, we know that this
pointer will not go out of scope because the control thread
and calling class is the owner. */
TestGonkCameraHardware* mTestHw;
};
TestGonkCameraHardware::TestGonkCameraHardware(nsGonkCameraControl* aTarget,
uint32_t aCameraId,
const sp<Camera>& aCamera)
: GonkCameraHardware(aTarget, aCameraId, aCamera)
, mMutex("TestGonkCameraHardware::mMutex")
, mCondVar(mMutex, "TestGonkCameraHardware::mCondVar")
{
DOM_CAMERA_LOGA("v===== Created TestGonkCameraHardware =====v\n");
DOM_CAMERA_LOGT("%s:%d : this=%p (aTarget=%p)\n",
__func__, __LINE__, this, aTarget);
MOZ_COUNT_CTOR(TestGonkCameraHardware);
mCameraThread = NS_GetCurrentThread();
}
TestGonkCameraHardware::~TestGonkCameraHardware()
{
MOZ_COUNT_DTOR(TestGonkCameraHardware);
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
if (mTestHw->mDomListener) {
mTestHw->mDomListener = nullptr;
nsresult rv = mJSTestWrapper->SetHandler(nullptr);
NS_WARN_IF(NS_FAILED(rv));
}
return NS_OK;
}
};
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
NS_WARN_IF(NS_FAILED(rv));
DOM_CAMERA_LOGA("^===== Destroyed TestGonkCameraHardware =====^\n");
}
nsresult
TestGonkCameraHardware::WaitWhileRunningOnMainThread(nsRefPtr<ControlMessage> aRunnable)
{
MutexAutoLock lock(mMutex);
if (NS_WARN_IF(!aRunnable)) {
mStatus = NS_ERROR_INVALID_ARG;
} else if (!NS_IsMainThread()) {
nsresult rv = NS_DispatchToMainThread(aRunnable);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = mCondVar.Wait();
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
} else {
/* Cannot dispatch to main thread since we would block on
the condvar, so we need to run inline. */
mStatus = aRunnable->RunInline();
}
return mStatus;
}
nsresult
TestGonkCameraHardware::Init()
{
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
nsresult rv = mJSTestWrapper->InitCamera();
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
mTestHw->mDomListener = new TestGonkCameraHardwareListener(mTestHw->mTarget, mTestHw->mCameraThread);
if (NS_WARN_IF(!mTestHw->mDomListener)) {
return NS_ERROR_FAILURE;
}
rv = mJSTestWrapper->SetHandler(mTestHw->mDomListener);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
return NS_OK;
}
};
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
NS_WARN_IF(NS_FAILED(rv));
return rv;
}
int
TestGonkCameraHardware::AutoFocus()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->AutoFocus();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
int
TestGonkCameraHardware::StartFaceDetection()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->StartFaceDetection();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
int
TestGonkCameraHardware::StopFaceDetection()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->StopFaceDetection();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
int
TestGonkCameraHardware::TakePicture()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->TakePicture();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
void
TestGonkCameraHardware::CancelTakePicture()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->CancelTakePicture();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
NS_WARN_IF(NS_FAILED(rv));
}
int
TestGonkCameraHardware::StartPreview()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->StartPreview();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
void
TestGonkCameraHardware::StopPreview()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->StopPreview();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
NS_WARN_IF(NS_FAILED(rv));
}
class TestGonkCameraHardware::PushParametersDelegate : public ControlMessage
{
public:
PushParametersDelegate(TestGonkCameraHardware* aTestHw, String8* aParams)
: ControlMessage(aTestHw)
, mParams(aParams)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
if (NS_WARN_IF(!mParams)) {
return NS_ERROR_INVALID_ARG;
}
DOM_CAMERA_LOGI("Push test parameters: %s\n", mParams->string());
return mJSTestWrapper->PushParameters(NS_ConvertASCIItoUTF16(mParams->string()));
}
String8* mParams;
};
class TestGonkCameraHardware::PullParametersDelegate : public ControlMessage
{
public:
PullParametersDelegate(TestGonkCameraHardware* aTestHw, nsString* aParams)
: ControlMessage(aTestHw)
, mParams(aParams)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
if (NS_WARN_IF(!mParams)) {
return NS_ERROR_INVALID_ARG;
}
nsresult rv = mJSTestWrapper->PullParameters(*mParams);
DOM_CAMERA_LOGI("Pull test parameters: %s\n",
NS_LossyConvertUTF16toASCII(*mParams).get());
return rv;
}
nsString* mParams;
};
int
TestGonkCameraHardware::PushParameters(const GonkCameraParameters& aParams)
{
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
String8 s = aParams.Flatten();
nsresult rv = WaitWhileRunningOnMainThread(new PushParametersDelegate(this, &s));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
nsresult
TestGonkCameraHardware::PullParameters(GonkCameraParameters& aParams)
{
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsString as;
nsresult rv = WaitWhileRunningOnMainThread(new PullParametersDelegate(this, &as));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
String8 s(NS_LossyConvertUTF16toASCII(as).get());
aParams.Unflatten(s);
return NS_OK;
}
#ifdef MOZ_WIDGET_GONK
int
TestGonkCameraHardware::PushParameters(const CameraParameters& aParams)
{
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
String8 s = aParams.flatten();
nsresult rv = WaitWhileRunningOnMainThread(new PushParametersDelegate(this, &s));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
void
TestGonkCameraHardware::PullParameters(CameraParameters& aParams)
{
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsString as;
nsresult rv = WaitWhileRunningOnMainThread(new PullParametersDelegate(this, &as));
if (NS_WARN_IF(NS_FAILED(rv))) {
as.Truncate();
}
String8 s(NS_LossyConvertUTF16toASCII(as).get());
aParams.unflatten(s);
}
#endif
int
TestGonkCameraHardware::StartRecording()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->StartRecording();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
int
TestGonkCameraHardware::StopRecording()
{
class Delegate : public ControlMessage
{
public:
Delegate(TestGonkCameraHardware* aTestHw)
: ControlMessage(aTestHw)
{ }
protected:
NS_IMETHOD
RunImpl() override
{
return mJSTestWrapper->StopRecording();
}
};
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
nsresult rv = WaitWhileRunningOnMainThread(new Delegate(this));
if (NS_WARN_IF(NS_FAILED(rv))) {
return UNKNOWN_ERROR;
}
return OK;
}
int
TestGonkCameraHardware::StoreMetaDataInBuffers(bool aEnabled)
{
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
return OK;
}