blob: 214e2df4bef79b1ae0c50a7b5116c9611f735c3c [file] [log] [blame]
#pragma once
#include <assert.h>
#include <ast_video_types.hpp>
#include <iostream>
#include <vector>
namespace AstVideo {
class VideoPuller {
//
// Cursor struct is used in User Mode
//
typedef struct _cursor_attribution_tag {
unsigned int posX;
unsigned int posY;
unsigned int cur_width;
unsigned int cur_height;
unsigned int cur_type; // 0:mono 1:color 2:disappear cursor
unsigned int cur_change_flag;
} AST_CUR_ATTRIBUTION_TAG;
//
// For storing Cursor Information
//
typedef struct _cursor_tag {
AST_CUR_ATTRIBUTION_TAG attr;
// unsigned char icon[MAX_CUR_OFFSETX*MAX_CUR_OFFSETY*2];
unsigned char *icon; //[64*64*2];
} AST_CURSOR_TAG;
//
// For select image format, i.e. 422 JPG420, 444 JPG444, lumin/chrom table, 0
// ~ 11, low to high
//
typedef struct _video_features {
short jpg_fmt; // 422:JPG420, 444:JPG444
short lumin_tbl;
short chrom_tbl;
short tolerance_noise;
int w;
int h;
unsigned char *buf;
} FEATURES_TAG;
//
// For configure video engine control registers
//
typedef struct _image_info {
short do_image_refresh; // Action 0:motion 1:fullframe 2:quick cursor
char qc_valid; // quick cursor enable/disable
unsigned int len;
int crypttype;
char cryptkey[16];
union {
FEATURES_TAG features;
AST_CURSOR_TAG cursor_info;
} parameter;
} IMAGE_INFO;
public:
VideoPuller() : image_info(){};
void initialize() {
std::cout << "Opening /dev/video\n";
video_fd = open("/dev/video", O_RDWR);
if (!video_fd) {
std::cout << "Failed to open /dev/video\n";
// TODO(Ed) throw exception?
} else {
std::cout << "Opened successfully\n";
}
}
RawVideoBuffer read_video() {
assert(video_fd != 0);
RawVideoBuffer raw;
image_info.do_image_refresh = 1; // full frame refresh
image_info.qc_valid = 0; // quick cursor disabled
image_info.parameter.features.buf =
reinterpret_cast<unsigned char *>(raw.buffer.data());
image_info.crypttype = -1;
std::cout << "Writing\n";
int status;
/*
status = write(video_fd, reinterpret_cast<char*>(&image_info),
sizeof(image_info));
if (status != sizeof(image_info)) {
std::cout << "Write failed. Return: " << status << "\n";
perror("perror output:");
}
std::cout << "Write done\n";
*/
std::cout << "Reading\n";
status = read(video_fd, reinterpret_cast<char *>(&image_info),
sizeof(image_info));
std::cout << "Reading\n";
if (status != 0) {
std::cout << "Read failed with status " << status << "\n";
}
raw.buffer.resize(image_info.len);
raw.height = image_info.parameter.features.h;
raw.width = image_info.parameter.features.w;
if (image_info.parameter.features.jpg_fmt == 422) {
raw.mode = YuvMode::YUV420;
} else {
raw.mode = YuvMode::YUV444;
}
return raw;
}
private:
int video_fd;
IMAGE_INFO image_info;
};
}