Bug 825110 - Part 1: Camera changes for B2G WebRTC video module. r=mhabicher

This commit is contained in:
Chiajung Hung 2013-05-02 07:59:58 -04:00
parent b11e1c3722
commit 0a3663582f
8 changed files with 90 additions and 29 deletions

View File

@ -106,6 +106,10 @@ CameraPreviewMediaStream::SetCurrentFrame(const gfxIntSize& aIntrinsicSize, Imag
NS_NewRunnableMethod(output, &VideoFrameContainer::Invalidate);
NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
}
if (mFrameCallback) {
mFrameCallback->OnNewFrame(aIntrinsicSize, aImage);
}
}
}

View File

@ -11,6 +11,11 @@
namespace mozilla {
class CameraPreviewFrameCallback {
public:
virtual void OnNewFrame(const gfxIntSize& aIntrinsicSize, layers::Image* aImage);
};
/**
* This is a stream for camere preview.
*
@ -42,11 +47,16 @@ public:
// Call these on any thread.
void SetCurrentFrame(const gfxIntSize& aIntrinsicSize, Image* aImage);
void SetFrameCallback(CameraPreviewFrameCallback* aCallback) {
mFrameCallback = aCallback;
}
protected:
// mMutex protects all the class' fields.
// This class is not registered to MediaStreamGraph.
// It needs to protect all the fields.
Mutex mMutex;
CameraPreviewFrameCallback* mFrameCallback;
};

View File

@ -455,3 +455,9 @@ nsDOMCameraControl::Shutdown()
DOM_CAMERA_LOGI("%s:%d\n", __func__, __LINE__);
mCameraControl->Shutdown();
}
nsRefPtr<ICameraControl>
nsDOMCameraControl::GetNativeCameraControl()
{
return mCameraControl;
}

View File

@ -17,7 +17,6 @@
namespace mozilla {
// Main camera control.
class nsDOMCameraControl : public nsICameraControl
{
@ -30,6 +29,7 @@ public:
nsICameraGetCameraCallback* onSuccess,
nsICameraErrorCallback* onError, uint64_t aWindowId);
nsresult Result(nsresult aResult, nsICameraGetCameraCallback* onSuccess, nsICameraErrorCallback* onError, uint64_t aWindowId);
nsRefPtr<ICameraControl> GetNativeCameraControl();
void Shutdown();

View File

@ -46,6 +46,9 @@ public:
void Register(mozilla::nsDOMCameraControl* aDOMCameraControl);
void OnNavigation(uint64_t aWindowId);
nsresult GetNumberOfCameras(int32_t& aDeviceCount);
nsresult GetCameraName(uint32_t aDeviceNum, nsCString& aDeviceName);
protected:
void XpComShutdown();
void Shutdown(uint64_t aWindowId);

View File

@ -5,6 +5,17 @@
#include "DOMCameraManager.h"
// From nsDOMCameraManager.
nsresult
nsDOMCameraManager::GetNumberOfCameras(int32_t& aDeviceCount)
{
return NS_ERROR_NOT_IMPLEMENTED;
};
nsresult
nsDOMCameraManager::GetCameraName(uint32_t aDeviceNum, nsCString& aDeviceName)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* [implicit_jscontext] jsval getListOfCameras (); */
NS_IMETHODIMP

View File

@ -22,6 +22,46 @@
#include "CameraCommon.h"
// From nsDOMCameraManager, but gonk-specific!
nsresult
nsDOMCameraManager::GetNumberOfCameras(int32_t& aDeviceCount)
{
aDeviceCount = android::Camera::getNumberOfCameras();
return NS_OK;
}
nsresult
nsDOMCameraManager::GetCameraName(uint32_t aDeviceNum, nsCString& aDeviceName)
{
int32_t count = android::Camera::getNumberOfCameras();
DOM_CAMERA_LOGI("getListOfCameras : getNumberOfCameras() returned %d\n", count);
if (aDeviceNum > count) {
DOM_CAMERA_LOGE("GetCameraName : invalid device number");
return NS_ERROR_NOT_AVAILABLE;
}
android::CameraInfo info;
int rv = android::Camera::getCameraInfo(aDeviceNum, &info);
if (rv != 0) {
DOM_CAMERA_LOGE("GetCameraName : get_camera_info(%d) failed: %d\n", aDeviceNum, rv);
return NS_ERROR_NOT_AVAILABLE;
}
switch (info.facing) {
case CAMERA_FACING_BACK:
aDeviceName.Assign("back");
break;
case CAMERA_FACING_FRONT:
aDeviceName.Assign("front");
break;
default:
aDeviceName.Assign("extra-camera-");
aDeviceName.AppendInt(aDeviceNum);
break;
}
return NS_OK;
}
/* [implicit_jscontext] jsval getListOfCameras (); */
NS_IMETHODIMP
@ -40,40 +80,25 @@ nsDOMCameraManager::GetListOfCameras(JSContext* cx, JS::Value* _retval)
return NS_ERROR_NOT_AVAILABLE;
}
DOM_CAMERA_LOGI("getListOfCameras : get_number_of_cameras() returned %d\n", count);
DOM_CAMERA_LOGI("getListOfCameras : getNumberOfCameras() returned %d\n", count);
while (count--) {
android::CameraInfo info;
int rv = android::Camera::getCameraInfo(count, &info);
if (rv != 0) {
DOM_CAMERA_LOGE("getListOfCameras : get_camera_info(%d) failed: %d\n", count, rv);
nsCString cameraName;
nsresult result = GetCameraName(count, cameraName);
if (result != NS_OK) {
continue;
}
JSString* v;
JSString* v = JS_NewStringCopyZ(cx, cameraName.get());
JS::Value jv;
switch (info.facing) {
case CAMERA_FACING_BACK:
v = JS_NewStringCopyZ(cx, "back");
index = 0;
break;
case CAMERA_FACING_FRONT:
v = JS_NewStringCopyZ(cx, "front");
index = 1;
break;
default:
// TODO: see bug 779143.
{
static uint32_t extraIndex = 2;
nsCString s;
s.AppendPrintf("extra-camera-%d", count);
v = JS_NewStringCopyZ(cx, s.get());
index = extraIndex++;
}
break;
if (!cameraName.Compare("back")) {
index = 0;
} else if (!cameraName.Compare("front")) {
index = 1;
} else {
static uint32_t extraIndex = 2;
index = extraIndex++;
}
if (!v) {
DOM_CAMERA_LOGE("getListOfCameras : out of memory populating camera list");
return NS_ERROR_NOT_AVAILABLE;

View File

@ -22,8 +22,10 @@ MODULE = 'dom'
EXPORTS += [
'CameraCommon.h',
'CameraPreviewMediaStream.h',
'DOMCameraManager.h',
'GonkNativeWindow.h',
'GonkNativeWindowClient.h',
'GonkCameraControl.h',
]