Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 35 additions & 20 deletions Android.mk
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,20 @@
# See the License for the specific language governing permissions and
# limitations under the License.

ifeq ($(TARGET_USE_CAMERA_VHAL), true)
#ifeq ($(TARGET_USE_CAMERA_VHAL), true)
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

ifneq ($(TARGET_BOARD_PLATFORM), celadon)
####### Build FFmpeg modules from prebuilt libs #########

FFMPEG_PREBUILD := prebuilts/ffmpeg-4.2.2/android-x86_64
FFMPEG_LIB_PATH := ${FFMPEG_PREBUILD}/lib

include $(CLEAR_VARS)
LOCAL_MODULE := libavcodec
LOCAL_CHECK_ELF_FILES := false
LOCAL_MULTILIB := 64
LOCAL_SRC_FILES := $(FFMPEG_LIB_PATH)/$(LOCAL_MODULE).so
LOCAL_PROPRIETARY_MODULE := true
Expand All @@ -33,6 +35,7 @@ include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := libswresample
LOCAL_CHECK_ELF_FILES := false
LOCAL_MULTILIB := 64
LOCAL_SRC_FILES := $(FFMPEG_LIB_PATH)/$(LOCAL_MODULE).so
LOCAL_PROPRIETARY_MODULE := true
Expand All @@ -42,6 +45,7 @@ include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := libavutil
LOCAL_CHECK_ELF_FILES := false
LOCAL_MULTILIB := 64
LOCAL_SRC_FILES := $(FFMPEG_LIB_PATH)/$(LOCAL_MODULE).so
LOCAL_PROPRIETARY_MODULE := true
Expand All @@ -51,6 +55,7 @@ include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := libavdevice
LOCAL_CHECK_ELF_FILES := false
LOCAL_MULTILIB := 64
LOCAL_SRC_FILES := $(FFMPEG_LIB_PATH)/$(LOCAL_MODULE).so
LOCAL_PROPRIETARY_MODULE := true
Expand All @@ -60,6 +65,7 @@ include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := libavfilter
LOCAL_CHECK_ELF_FILES := false
LOCAL_MULTILIB := 64
LOCAL_SRC_FILES := $(FFMPEG_LIB_PATH)/$(LOCAL_MODULE).so
LOCAL_PROPRIETARY_MODULE := true
Expand All @@ -69,6 +75,7 @@ include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := libavformat
LOCAL_CHECK_ELF_FILES := false
LOCAL_MULTILIB := 64
LOCAL_SRC_FILES := $(FFMPEG_LIB_PATH)/$(LOCAL_MODULE).so
LOCAL_PROPRIETARY_MODULE := true
Expand All @@ -78,19 +85,26 @@ include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := libswscale
LOCAL_CHECK_ELF_FILES := false
LOCAL_MULTILIB := 64
LOCAL_SRC_FILES := $(FFMPEG_LIB_PATH)/$(LOCAL_MODULE).so
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
include $(BUILD_PREBUILT)
##########################################################
endif

include $(CLEAR_VARS)

##################### Build camera-vhal #######################

ifeq ($(TARGET_BOARD_PLATFORM), celadon)
LOCAL_MODULE := camera.$(TARGET_BOARD_PLATFORM)
else
LOCAL_MODULE := camera.$(TARGET_PRODUCT)
endif

LOCAL_MULTILIB := 64
LOCAL_VENDOR_MODULE := true

Expand All @@ -108,42 +122,40 @@ camera_vhal_src := \
src/Exif.cpp \
src/Thumbnail.cpp \
src/CameraSocketServerThread.cpp \
src/CameraSocketCommand.cpp \
src/CGCodec.cpp

src/CameraSocketCommand.cpp
ifneq ($(TARGET_BOARD_PLATFORM), celadon)
camera_vhal_src += src/CGCodec.cpp
endif
camera_vhal_c_includes := external/libjpeg-turbo \
external/libexif \
external/libyuv/files/include \
frameworks/native/include/media/hardware \
device/generic/goldfish/include \
device/generic/goldfish-opengl/system/OpenglSystemCommon \
hardware/libhardware/modules/gralloc \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/$(FFMPEG_PREBUILD)/include \
$(call include-path-for, camera)

camera_vhal_shared_libraries := \
libbinder \
libexif \
liblog \
libutils \
libcutils \
libEGL \
libGLESv1_CM \
libGLESv2 \
libui \
libdl \
libjpeg \
libcamera_metadata \
libhardware \
libsync \
libavcodec \
libsync

ifneq ($(TARGET_BOARD_PLATFORM), celadon)
camera_vhal_shared_libraries += libavcodec \
libavdevice \
libavfilter \
libavformat \
libavutil \
libswresample \
libswscale
endif

camera_vhal_static_libraries := \
android.hardware.camera.common@1.0-helper \
Expand All @@ -158,6 +170,12 @@ ifeq ($(BOARD_USES_GRALLOC1), true)
camera_vhal_cflags += -DUSE_GRALLOC1
endif

ifeq ($(TARGET_BOARD_PLATFORM), celadon)
camera_vhal_cflags += -DGRALLOC_MAPPER4
else
camera_vhal_cflags += -DENABLE_FFMPEG
endif

LOCAL_MODULE_RELATIVE_PATH := ${camera_vhal_module_relative_path}
LOCAL_CFLAGS := ${camera_vhal_cflags}
LOCAL_CPPFLAGS += -std=c++17
Expand All @@ -168,13 +186,6 @@ LOCAL_SRC_FILES := ${camera_vhal_src}
LOCAL_SHARED_LIBRARIES := ${camera_vhal_shared_libraries}
LOCAL_STATIC_LIBRARIES := ${camera_vhal_static_libraries}

LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/$(FFMPEG_PREBUILD)/include

# to support platfrom build system
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_EXPORT_C_INCLUDES)

include $(BUILD_SHARED_LIBRARY)

#####################################################
Expand Down Expand Up @@ -217,10 +228,14 @@ LOCAL_SHARED_LIBRARIES := ${jpeg_shared_libraries}
LOCAL_C_INCLUDES += ${jpeg_c_includes}
LOCAL_SRC_FILES := ${jpeg_src}

ifeq ($(TARGET_BOARD_PLATFORM), celadon)
LOCAL_MODULE := camera.$(TARGET_BOARD_PLATFORM).jpeg
else
LOCAL_MODULE := camera.$(TARGET_PRODUCT).jpeg
endif

include $(BUILD_SHARED_LIBRARY)

######################################################

endif # TARGET_USE_CAMERA_VHAL
#endif # TARGET_USE_CAMERA_VHAL
91 changes: 74 additions & 17 deletions include/CameraSocketCommand.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,17 @@ namespace android {

namespace socket {

enum class VideoCodecType { kH264 = 0 };
enum class FrameResolution { k480p = 0, k720p, k1080p };
enum class VideoCodecType { kH264 = 1, kH265 = 2,kI420 = 4, kMJPEG = 8, kAll = 15 };
enum class FrameResolution { k480p = 1, k720p = 2, k1080p = 4, kWXGA = 8, kAll = 15 };

struct CameraFrameInfo {
VideoCodecType codec_type = VideoCodecType::kH264;
FrameResolution resolution = FrameResolution::k480p;
uint32_t reserved[4];
enum class SensorOrientation {
ORIENTATION_0 = 0,
ORIENTATION_90 = 90,
ORIENTATION_180 = 180,
ORIENTATION_270 = 270
};

enum class CameraOperation { kOpen = 11, kClose = 12, kNone = 13 };
enum class CameraFacing { BACK_FACING = 0, FRONT_FACING = 1 };

enum class CameraSessionState {
kNone,
Expand All @@ -53,17 +54,73 @@ enum class CameraSessionState {

extern const std::unordered_map<CameraSessionState, std::string> kCameraSessionStateNames;

enum class CameraVHalVersion {
kV1 = 0, // decode out of camera vhal
kV2 = 1, // decode in camera vhal
};
typedef enum _ack_value {
NACK_CONFIG = 0,
ACK_CONFIG = 1,
} camera_ack_t;

// has default values.
struct CameraConfig {
CameraVHalVersion version = CameraVHalVersion::kV2;
CameraOperation operation = CameraOperation::kNone;
CameraFrameInfo frame_info;
};
typedef struct _camera_config {
uint32_t cameraId;
uint32_t codec_type;
uint32_t resolution;
char pkg_name[128];
uint32_t reserved[5];
} camera_config_t;

typedef enum _camera_cmd {
CMD_OPEN = 11,
CMD_CLOSE = 12,
} camera_cmd_t;

typedef enum _camera_version {
CAMERA_VHAL_VERSION_1 = 0, // decode out of camera vhal
CAMERA_VHAL_VERSION_2 = 1, // decode in camera vhal
} camera_version_t;

typedef struct _camera_config_cmd {
camera_version_t version;
camera_cmd_t cmd;
camera_config_t config;
} camera_config_cmd_t;

typedef struct _camera_info {
uint32_t cameraId;
uint32_t codec_type;
uint32_t resolution;
uint32_t sensorOrientation;
uint32_t facing; // '0' for back camera and '1' for front camera
uint32_t reserved[3];
} camera_info_t;

typedef struct _camera_capability {
uint32_t codec_type; // All supported codec_type
uint32_t resolution; // All supported resolution
uint32_t maxNumberOfCameras; // Max will be restricted to 2
uint32_t reserved[5];
} camera_capability_t;

typedef enum _camera_packet_type {
REQUEST_CAPABILITY = 0,
CAPABILITY = 1,
CAMERA_CONFIG = 2,
CAMERA_DATA = 3,
ACK = 4,
CAMERA_INFO = 5,
} camera_packet_type_t;

typedef struct _camera_header {
camera_packet_type_t type;
uint32_t size; // number of cameras * sizeof(camera_info_t)
} camera_header_t;

typedef struct _camera_packet {
camera_header_t header;
uint8_t payload[0];
} camera_packet_t;

const char* camera_type_to_str(int type);
const char* codec_type_to_str(uint32_t type);
const char* resolution_to_str(uint32_t resolution);
} // namespace socket
} // namespace android

Expand Down
41 changes: 39 additions & 2 deletions include/CameraSocketServerThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,41 +28,78 @@
#include <memory>
#include <atomic>
#include <array>
#include <chrono>
#include <thread>
#ifdef ENABLE_FFMPEG
#include "CGCodec.h"
#endif
#include "CameraSocketCommand.h"
#include <linux/vm_sockets.h>
#include "VirtualBuffer.h"

namespace android {

enum tranSock
{
UNIX = 0,
TCP = 1,
VSOCK = 2,
PIPE = 3,
};

class VirtualCameraFactory;
class CameraSocketServerThread : public Thread {
public:
#ifdef ENABLE_FFMPEG
CameraSocketServerThread(std::string suffix, std::shared_ptr<CGVideoDecoder> decoder,
std::atomic<socket::CameraSessionState> &state);
#else
CameraSocketServerThread(std::string suffix,
std::atomic<socket::CameraSessionState> &state);
#endif
~CameraSocketServerThread();

virtual void requestExit();
virtual status_t requestExitAndWait();
int getClientFd();
void clearBuffer();
void clearBuffer(char *buffer, int width, int height);
ssize_t size_update = 0;
pthread_cond_t mSignalHotplug = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mHotplugLock = PTHREAD_MUTEX_INITIALIZER;

bool configureCapabilities(bool skipCapRead);
int UpdateCameraInfo();

private:
virtual status_t readyToRun();
virtual bool threadLoop() override;
bool ProcessCameraDataFromPipe(ClientVideoBuffer *handle);

void setCameraResolution(uint32_t resolution);
void setCameraMaxSupportedResolution(int32_t width, int32_t height);

Mutex mMutex;
bool mRunning; // guarding only when it's important
int mSocketServerFd = -1;
std::string mSocketPath;
int mClientFd = -1;
int mNumOfCamerasRequested; // Number of cameras requested to support by client.

#ifdef ENABLE_FFMPEG
std::shared_ptr<CGVideoDecoder> mVideoDecoder;
#endif
std::atomic<socket::CameraSessionState> &mCameraSessionState;

// maximum size of a H264 packet in any aggregation packet is 65535 bytes.
// Source: https://tools.ietf.org/html/rfc6184#page-13
std::array<uint8_t, 200 * 1024> mSocketBuffer = {};
size_t mSocketBufferSize = 0;

struct ValidateClientCapability {
bool validCodecType = false;
bool validResolution = false;
bool validOrientation = false;
bool validCameraFacing = false;
};
};
} // namespace android

Expand Down
Loading