The code submitted here builds a camera.goldfish.so module that encapsulates a camera HAL. The major components of the camera HAL implementation are: * Generic HAL module implemented in emulated_camera_hal.cpp There is nothing much to it: just exporting the required HAL header. * EmulatedCameraFactory class that manages emulated cameras, and provides handling for camera_module_methods_ methods. There is only one object of this class, that is statically instantiated when camera.goldfish.so module is loaded. * EmulatedCamera class that implements camera_device_ops_t API. Objects of this class are instantiated during EmulatedCameraFactory construction, and they interact with objects of EmulatedCameraDevice class to get frames. * EmulatedCameraDevice class encapsulates an actual camera device. Objects of this class are contained in EmulatedCameraDevice objects, and interact with them as required by the API. The fake camera implementation is shared between EmulatedFakeCamera, and EmulatedFakeCameraDevice classes. They are pretty light. In fact, EmulatedFakeCamera is nothing more than just a placeholder for EmulatedFakeCameraDevice instance, and EmulatedFakeCameraDevice does nothing more, than just drawing a checker board with a bouncing square. Other components / routines are minor: helpers, wrappers, etc. The code is heavily commented, so there will be plenty of explanations between the lines. Change-Id: I4463e14c255c6e3b1dcca17bed5f4efde32d9879
57 lines
1.7 KiB
C++
57 lines
1.7 KiB
C++
/*
|
|
* Copyright (C) 2011 The Android Open Source Project
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
/*
|
|
* Contains implemenation of framebuffer conversion routines.
|
|
*/
|
|
|
|
#define LOG_NDEBUG 0
|
|
#define LOG_TAG "EmulatedCamera_Converter"
|
|
#include <cutils/log.h>
|
|
#include "converters.h"
|
|
|
|
namespace android {
|
|
|
|
void YV12ToRGB565(const void* yv12, void* rgb, int width, int height)
|
|
{
|
|
const int pix_total = width * height;
|
|
uint16_t* rgb_buf = reinterpret_cast<uint16_t*>(rgb);
|
|
const uint8_t* Y = reinterpret_cast<const uint8_t*>(yv12);
|
|
const uint8_t* Cb_pos = Y + pix_total;
|
|
const uint8_t* Cr_pos = Cb_pos + pix_total / 4;
|
|
const uint8_t* Cb = Cb_pos;
|
|
const uint8_t* Cr = Cr_pos;
|
|
for (int y = 0; y < height; y++) {
|
|
for (int x = 0; x < width; x += 2) {
|
|
const uint8_t nCb = *Cb; Cb++;
|
|
const uint8_t nCr = *Cr; Cr++;
|
|
*rgb_buf = YCbCrToRGB565(*Y, nCb, nCr);
|
|
Y++; rgb_buf++;
|
|
*rgb_buf = YCbCrToRGB565(*Y, nCb, nCr);
|
|
Y++; rgb_buf++;
|
|
}
|
|
if (y & 0x1) {
|
|
Cb_pos = Cb;
|
|
Cr_pos = Cr;
|
|
} else {
|
|
Cb = Cb_pos;
|
|
Cr = Cr_pos;
|
|
}
|
|
}
|
|
}
|
|
|
|
}; /* namespace android */
|