android13/external/camera_engine_rkaiq/rk_stream/stream_cfg/Stream.h

344 lines
11 KiB
C++
Executable File

/*
* Copyright (c) 2019 Rockchip Corporation
*
* 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.
*
*/
#ifndef _STREAM_H_
#define _STREAM_H_
#include <sys/mman.h>
#include <v4l2_device.h>
#include "poll_thread.h"
#include "xcam_mutex.h"
using namespace XCam;
namespace RkRawStream {
#define LOGD_RKSTREAM(...) XCAM_MODULE_LOG_DEBUG(XCORE_LOG_MODULE_RKRAWSTREAM, 0xff, ##__VA_ARGS__)
#define LOGI_RKSTREAM(...) XCAM_MODULE_LOG_INFO(XCORE_LOG_MODULE_RKRAWSTREAM, 0xff, ##__VA_ARGS__)
#define LOGW_RKSTREAM(...) XCAM_MODULE_LOG_WARNING(XCORE_LOG_MODULE_RKRAWSTREAM, 0xff, ##__VA_ARGS__)
#define LOGE_RKSTREAM(...) XCAM_MODULE_LOG_ERROR(XCORE_LOG_MODULE_RKRAWSTREAM, 0xff, ##__VA_ARGS__)
class RkPollThread;
class RKStream
{
public:
RKStream (SmartPtr<V4l2Device> dev, int type);
RKStream (SmartPtr<V4l2SubDevice> dev, int type);
RKStream (const char *path, int type);
virtual ~RKStream ();
virtual void start ();
virtual void startThreadOnly ();
virtual void startDeviceOnly ();
virtual void stop ();
virtual void stopThreadOnly ();
virtual void stopDeviceOnly ();
virtual void stopDeviceStreamoff ();
virtual void stopDeviceFreebuffer ();
virtual void pause ();
virtual void resume ();
virtual bool setPollCallback (PollCallback *callback);
virtual SmartPtr<VideoBuffer>
new_video_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
virtual SmartPtr<VideoBuffer>
new_video_buffer(struct v4l2_event &event, SmartPtr<V4l2Device> dev) { return NULL; }
virtual SmartPtr<V4l2BufferProxy>
new_v4l2proxy_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev) { return NULL; }
void set_device_prepared(bool prepare);
XCamReturn virtual getFormat(struct v4l2_format &format);
XCamReturn virtual getFormat(struct v4l2_subdev_format &format);
protected:
XCAM_DEAD_COPY (RKStream);
protected:
static const char* poll_type_to_str[ISP_POLL_POST_MAX];
SmartPtr<V4l2Device> _dev;
SmartPtr<V4l2SubDevice> _subdev;
int _dev_type;
SmartPtr<RkPollThread> _poll_thread;
bool _dev_prepared;
};
class RkPollThread : public Thread
{
public:
explicit RkPollThread (const char* thName, int type, SmartPtr<V4l2Device> dev, RKStream *stream);
explicit RkPollThread (const char* thName, int type, SmartPtr<V4l2SubDevice> dev, RKStream *stream);
virtual ~RkPollThread ();
virtual bool setPollCallback (PollCallback *callback);
virtual XCamReturn start();
virtual XCamReturn stop ();
protected:
XCAM_DEAD_COPY (RkPollThread);
XCamReturn poll_buffer_loop ();
virtual bool loop () {
XCamReturn ret = poll_buffer_loop ();
if (ret == XCAM_RETURN_NO_ERROR || ret == XCAM_RETURN_ERROR_TIMEOUT ||
ret == XCAM_RETURN_BYPASS)
return true;
return false;
}
XCamReturn create_stop_fds ();
void destroy_stop_fds ();
protected:
static const int default_poll_timeout;
SmartPtr<V4l2Device> _dev;
SmartPtr<V4l2SubDevice> _subdev;
PollCallback *_poll_callback;
RKStream *_stream;
//frame syncronization
int frameid;
int _dev_type;
int _poll_stop_fd[2];
};
class RkEventPollThread : public RkPollThread
{
public:
explicit RkEventPollThread (const char* thName, int type, SmartPtr<V4l2Device> dev, RKStream *stream);
explicit RkEventPollThread (const char* thName, int type, SmartPtr<V4l2SubDevice> subdev, RKStream *stream);
virtual ~RkEventPollThread ();
protected:
XCAM_DEAD_COPY (RkEventPollThread);
virtual XCamReturn poll_event_loop ();
virtual bool loop () {
XCamReturn ret = poll_event_loop ();
if (ret == XCAM_RETURN_NO_ERROR || ret == XCAM_RETURN_ERROR_TIMEOUT ||
XCAM_RETURN_BYPASS)
return true;
return false;
}
//SmartPtr<V4l2SubDevice> _subdev;
struct v4l2_event _event;
};
class RKRawStream : public RKStream
{
public:
RKRawStream (SmartPtr<V4l2Device> dev, int index, int type);
virtual ~RKRawStream ();
virtual SmartPtr<V4l2BufferProxy>
new_v4l2proxy_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
public:
int _dev_index;
protected:
XCAM_DEAD_COPY (RKRawStream);
};
/*
class RKStream
{
public:
RKStream (SmartPtr<V4l2Device> dev, int type);
RKStream (SmartPtr<V4l2SubDevice> dev, int type);
RKStream (const char *path, int type);
virtual ~RKStream ();
virtual void start ();
virtual void startThreadOnly ();
virtual void startDeviceOnly ();
virtual void stop ();
virtual void stopThreadOnly ();
virtual void stopDeviceOnly ();
virtual void pause ();
virtual void resume ();
virtual bool setPollCallback (PollCallback *callback);
virtual SmartPtr<VideoBuffer>
new_video_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
virtual SmartPtr<VideoBuffer>
new_video_buffer(struct v4l2_event &event, SmartPtr<V4l2Device> dev) { return NULL; }
virtual SmartPtr<V4l2BufferProxy>
new_v4l2proxy_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev) { return NULL; }
void set_device_prepared(bool prepare);
XCamReturn virtual getFormat(struct v4l2_format &format);
XCamReturn virtual getFormat(struct v4l2_subdev_format &format);
protected:
XCAM_DEAD_COPY (RKStream);
protected:
static const char* poll_type_to_str[ISP_POLL_POST_MAX];
SmartPtr<V4l2Device> _dev;
SmartPtr<V4l2SubDevice> _subdev;
int _dev_type;
SmartPtr<RkPollThread> _poll_thread;
bool _dev_prepared;
};
class BaseSensorHw;
class LensHw;
class RKStatsStream : public RKStream
{
public:
RKStatsStream (SmartPtr<V4l2Device> dev, int type);
// RKStatsStream (const char *name, int type);
virtual ~RKStatsStream ();
bool set_event_handle_dev(SmartPtr<BaseSensorHw> &dev);
bool set_iris_handle_dev(SmartPtr<LensHw> &dev);
bool set_focus_handle_dev(SmartPtr<LensHw> &dev);
bool set_rx_handle_dev(CamHwIsp20* dev);
virtual SmartPtr<VideoBuffer>
new_video_buffer(SmartPtr<V4l2Buffer> buf, SmartPtr<V4l2Device> dev);
protected:
XCAM_DEAD_COPY (RKStatsStream);
private:
//alliance devices
SmartPtr<BaseSensorHw> _event_handle_dev;
SmartPtr<LensHw> _iris_handle_dev;
SmartPtr<LensHw> _focus_handle_dev;
CamHwIsp20* _rx_handle_dev;
};
class SubVideoBuffer : public VideoBuffer
{
public:
explicit SubVideoBuffer(int num, int index, int fd, const VideoBufferInfo& info)
: VideoBuffer(info) {
_buff_num = num;
_buff_idx = index;
_buff_fd = fd;
_buff_size = 0;
_buff_ptr = MAP_FAILED;
_v4l2buf_proxy = nullptr;
}
explicit SubVideoBuffer(int fd)
:VideoBuffer()
{
_buff_fd = fd;
_buff_size = 0;
_buff_ptr = MAP_FAILED;
_v4l2buf_proxy = nullptr;
}
explicit SubVideoBuffer(SmartPtr<V4l2BufferProxy> &buf)
:VideoBuffer()
{
_buff_fd = -1;
_buff_size = 0;
_buff_ptr = MAP_FAILED;
_v4l2buf_proxy = buf;
}
explicit SubVideoBuffer()
:VideoBuffer()
{
_buff_fd = -1;
_buff_size = 0;
_buff_ptr = MAP_FAILED;
_v4l2buf_proxy = nullptr;
}
virtual ~SubVideoBuffer() {}
virtual uint8_t *map ()
{
if (_v4l2buf_proxy.ptr()) {
return (uint8_t *)_v4l2buf_proxy->get_v4l2_userptr();
}
if (_buff_ptr == MAP_FAILED) {
_buff_ptr = mmap (NULL, _buff_size ? _buff_size: get_size (), PROT_READ | PROT_WRITE, MAP_SHARED, _buff_fd, 0);
if (_buff_ptr == MAP_FAILED) {
LOGE("mmap failed, size=%d,fd=%d",_buff_size,_buff_fd);
return nullptr;
}
}
return (uint8_t *)_buff_ptr;
}
virtual bool unmap ()
{
if (_v4l2buf_proxy.ptr()) {
return true;
}
if (_buff_ptr != MAP_FAILED) {
munmap(_buff_ptr, _buff_size ? _buff_size: get_size ());
_buff_ptr = MAP_FAILED;
}
return true;
}
virtual int get_fd ()
{
if (_v4l2buf_proxy.ptr()) {
return _v4l2buf_proxy->get_expbuf_fd();
}
return _buff_fd;
}
int set_buff_info(int fd, int size)
{
_buff_fd = fd;
_buff_size = size;
return 0;
}
int get_buf_num() { return _buff_num; }
int get_index() { return _buff_idx; }
int get_size() { return _buff_size; }
protected:
XCAM_DEAD_COPY (SubVideoBuffer);
private:
int _buff_fd;
int _buff_size;
int _buff_idx;
int _buff_num;
void *_buff_ptr;
SmartPtr<V4l2BufferProxy> _v4l2buf_proxy;
};
class SubV4l2BufferProxy : public V4l2BufferProxy
{
public:
explicit SubV4l2BufferProxy(SmartPtr<V4l2Buffer> &buf, SmartPtr<V4l2Device> &device)
:V4l2BufferProxy(buf, device)
{
_buff_ptr = MAP_FAILED;
_buff_fd = -1;
_buff_size = 0;
}
virtual ~SubV4l2BufferProxy() {}
virtual uint8_t *map ()
{
if (_buff_ptr == MAP_FAILED) {
_buff_ptr = mmap (NULL, _buff_size ? _buff_size: get_size (), PROT_READ | PROT_WRITE, MAP_SHARED, _buff_fd, 0);
if (_buff_ptr == MAP_FAILED) {
LOGE("mmap failed, size=%d,fd=%d",_buff_size,_buff_fd);
return nullptr;
}
}
return (uint8_t *)_buff_ptr;
}
virtual bool unmap ()
{
if (_buff_ptr != MAP_FAILED) {
munmap(_buff_ptr, _buff_size ? _buff_size: get_size ());
_buff_ptr = MAP_FAILED;
}
return true;
}
virtual int get_fd ()
{
return _buff_fd;
}
int set_buff_info(int fd, int size)
{
_buff_fd = fd;
_buff_size = size;
return 0;
}
protected:
XCAM_DEAD_COPY (SubV4l2BufferProxy);
int _buff_fd;
int _buff_size;
void *_buff_ptr;
};
*/
}
#endif