⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prograssiveexample.c

📁 德州仪器新推出的达芬奇技术dm355的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:

/* Header files */
#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
#include <getopt.h>

#include <sys/types.h>
#include <sys/mman.h>


#include <linux/fb.h>

#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <asm/types.h>		/* for videodev2.h */
#include <time.h>
#include <media/davinci_vpfe.h>	/*kernel header file, prefix path comes from makefile */

#include <video/davincifb.h>
#include "osd16.h"
#include "test_8.h"

struct buffer {
	void *start;
	size_t length;
};

#define     CAPTURE_DEVICE  "/dev/video0"


#define WIDTH 	720
#define HEIGHT 	576

#define MIN_BUFFERS 2

#define UYVY_BLACK          0x10801080

/* Device parameters */
#define OSD0_DEVICE      "/dev/fb/0"
#define OSD1_DEVICE      "/dev/fb/2"

#define FBVID1_DEVICE    "/dev/fb/3"



/* Function error codes */
#define SUCCESS         0
#define FAILURE         -1
/* Bits per pixel for video window */
#define YUV_422_BPP     16
#define BITMAP_BPP_8    8

#define DISPLAY_INTERFACE	COMPOSITE
#define DISPLAY_MODE		NTSC

#define round_32(width) ((((width) + 31) / 32) * 32 )


#define VID1_WIDTH 		720
#define VID1_HEIGHT		480
#define VID1_BPP		16
#define VID1_FRAME_SIZE		(VID1_WIDTH*VID1_HEIGHT)
#define VID1_VMODE		FB_VMODE_INTERLACED

#define OSD0_BPP		4	
#define	OSD0_WIDTH		(round_32(240*OSD0_BPP/8) * 8/OSD0_BPP)	//240
#define	OSD0_HEIGHT		120	
#define OSD0_FRAME_SIZE		(OSD0_WIDTH*OSD0_HEIGHT)
#define OSD0_VMODE		FB_VMODE_INTERLACED

#define OSD1_BPP		8
#define	OSD1_WIDTH		(round_32(240*OSD1_BPP/8) * 8/OSD1_BPP)
#define	OSD1_HEIGHT		120
#define OSD1_FRAME_SIZE		(OSD1_WIDTH*OSD1_HEIGHT)
#define OSD1_VMODE		FB_VMODE_INTERLACED

/* position */ 
#define	OSD0_XPOS		0	
#define	OSD0_YPOS		0	
#define	OSD1_XPOS		300
#define	OSD1_YPOS		250
#define	VID1_XPOS		0
#define	VID1_YPOS		0

/* Zoom Params */
#define	OSD0_HZOOM		0	
#define	OSD0_VZOOM		0	
#define	OSD1_HZOOM		0
#define	OSD1_VZOOM		0
#define	VID1_HZOOM		0
#define	VID1_VZOOM		0

/* OSd window blend factor */
#define OSD1_WINDOW_BF	0
#define OSD1_WINDOW_CK	0
#define OSD1_CK		0
#define OSD0_WINDOW_BF	3
#define OSD0_WINDOW_CK	0
#define OSD0_CK		0

#define VIDEO_NUM_BUFS		3
#define OSD_NUM_BUFS		2
#define RED_COLOR 		249
#define BLUE_COLOR 		140	//blue color
#define RAM_CLUT_IDX 		0xFF
#define BITMAP_COLOR		0x11

#define CURSOR_XPOS		100
#define CURSOR_YPOS		100
#define CURSOR_XRES		50
#define CURSOR_YRES		50
#define CURSOR_THICKNESS	1
#define CURSOR_COLOR		0xF9

#define ATTR_BLINK_INTERVAL	1
#define ATTR_BLEND_VAL 		0xaa

struct vpbe_test_info {

	int vid1_width;
	int vid1_height;
	int vid1_bpp;
	int vid1_frame_size;
	int vid1_vmode;

	int osd0_bpp;
	int osd0_width;
	int osd0_height;
	int osd0_frame_size;
	int osd0_vmode;

	int osd1_bpp;
	int osd1_width;
	int osd1_height;
	int osd1_frame_size;
	int osd1_vmode;

	int osd0_xpos;
	int osd0_ypos;
	int osd1_xpos;
	int osd1_ypos;
	int vid1_xpos;
	int vid1_ypos;

	int osd0_hzoom;
	int osd0_vzoom;
	int osd1_hzoom;
	int osd1_vzoom;
	int vid1_hzoom;
	int vid1_vzoom;

	int osd1_window_bf;
	int osd1_window_ck;
	int osd1_ck;
	int osd0_window_bf;
	int osd0_window_ck;
	int osd0_ck;

	int display_interface;
	int display_mode;

	int osd0_coloridx;
	int osd1_coloridx;
	int ram_clut_idx;
	int bitmap_color;

	int cursor_xpos;
	int cursor_ypos;
	int cursor_xres;
	int cursor_yres;
	int cursor_thickness;
	int cursor_color;

	int attr_blink_interval;
	int attr_blend_val;
};

static struct vpbe_test_info test_data = {

	VID1_WIDTH,
	VID1_HEIGHT,
	VID1_BPP,
	VID1_FRAME_SIZE,
	VID1_VMODE,

	OSD0_BPP,
	OSD0_WIDTH,
	OSD0_HEIGHT,
	OSD0_FRAME_SIZE,
	OSD0_VMODE,

	OSD1_BPP,
	OSD1_WIDTH,
	OSD1_HEIGHT,
	OSD1_FRAME_SIZE,
	OSD1_VMODE,

	OSD0_XPOS,
	OSD0_YPOS,
	OSD1_XPOS,
	OSD1_YPOS,
	VID1_XPOS,
	VID1_YPOS,

	OSD0_HZOOM,
	OSD0_VZOOM,
	OSD1_HZOOM,
	OSD1_VZOOM,
	VID1_HZOOM,
	VID1_VZOOM,

	OSD1_WINDOW_BF,
	OSD1_WINDOW_CK,
	OSD1_CK,
	OSD0_WINDOW_BF,
	OSD0_WINDOW_CK,
	OSD0_CK,

	DISPLAY_INTERFACE,
	DISPLAY_MODE,

	BLUE_COLOR,
	RED_COLOR,
	RAM_CLUT_IDX,
	BITMAP_COLOR,

	CURSOR_XPOS,
	CURSOR_YPOS,
	CURSOR_XRES,
	CURSOR_YRES,
	CURSOR_THICKNESS,
	CURSOR_COLOR,

	ATTR_BLINK_INTERVAL,
	ATTR_BLEND_VAL,
};

#define DEBUG

#ifdef DEBUG
#define DBGENTER  		printf("%s : E", __FUNCTION__);
#define DBGEXIT			printf("%s : L", __FUNCTION__);
#define PREV_DEBUG(x)		printf("DEBUG:%s:%s:%s",__FUNCTION__,__LINE__,x);
#else
#define DBGENTER
#define DBGEXIT
#define PREV_DEBUG(x)
#endif

#define CLEAR(x) memset (&(x), 0, sizeof (x))

/* ************************************************************************/
//Globals
/* ************************************************************************/
static int fdCapture = -1;
static int fdDisplay = -1;
struct buffer *buffers = NULL;
static int nBuffers = 0;
static int nWidthFinal = 0;
static int nHeightFinal = 0;
struct fb_var_screeninfo var;
struct fb_fix_screeninfo fix;
static int quit = 0;
char *vid1_display[VIDEO_NUM_BUFS] = { NULL, NULL, NULL };
char *osd0_display[OSD_NUM_BUFS] = { NULL, NULL };
char *osd1_display[OSD_NUM_BUFS] = { NULL, NULL };
int fd_vid1 = 0, fd_osd0 = 0, fd_osd1 = 0;
struct fb_var_screeninfo vid1_varInfo, osd0_varInfo,
    osd1_varInfo, prev_osd0_var, prev_osd1_var, prev_vid1_var;
struct fb_fix_screeninfo vid1_fixInfo, osd0_fixInfo,
    osd1_fixInfo;
int vid1_size, osd0_size, osd1_size;
zoom_params_t zoom;
int stress_test = 1;		
int startLoopCnt = 500;
int rgb565_enable = 0;		
int rgb565_enable_osd1 = 0;	
vpbe_bitmap_blend_params_t blend_info;

extern int errno;
int StartLoop(void);
static int InitCaptureDevice(void);
static int SetDataFormat(void);
static int InitCaptureBuffers(void);
static int StartStreaming(void);
static void Initialize_Capture(void);
static int DisplayFrame(char, void *);
static int Displaybitmap(char);
static int Displaybitmaposd0(void);
static int Displaybitmaposd1(void);
int unmap_and_disable(char);

void restore_config()
{
	vpbe_mode_info_t mode_info;
	vpbe_window_position_t pos;
	struct fb_cursor cursor_info;
	DBGENTER;
	cursor_info.enable = VPBE_DISABLE;
	cursor_info.image.dx = CURSOR_XPOS;
	cursor_info.image.dy = CURSOR_YPOS;
	cursor_info.image.width = CURSOR_XRES;
	cursor_info.image.height = CURSOR_YRES;
	cursor_info.image.depth = CURSOR_THICKNESS;
	cursor_info.image.fg_color = CURSOR_COLOR;
	if (ioctl(fd_vid1, FBIO_SET_CURSOR, &cursor_info) < 0) {
		perror("\nFailed  FBIO_SET_CURSOR");
		return;
	}


        /* Set attribute  window */
        if (ioctl(fd_osd1, FBIO_ENABLE_DISABLE_ATTRIBUTE_WIN, VPBE_ENABLE)
            < 0) {
                printf("\nFailed  FBIO_ENABLE_DISABLE_ATTRIBUTE_WIN");
                return;
        }

	mode_info.interface = COMPOSITE;
	mode_info.mode_idx = NTSC;

	if (ioctl(fd_vid1, FBIO_QUERY_TIMING, &mode_info) < 0) {
		printf("\nFailed  FBIO_QUERY_TIMING");
		close(fd_vid1);
		return;
	}

	if (!strcmp(mode_info.vid_mode.name, "\0")) {
		printf("mode not supported\n");
		close(fd_vid1);
		return;
	}
	/* Set MODE */
	if (ioctl(fd_vid1, FBIO_SET_TIMING, &mode_info.vid_mode) < 0) {
		printf("\nFailed  FBIO_SET_TIMING");
		close(fd_vid1);
		return;
	}

	/* Get Existing var_screeninfo for vid0 window */
        if (ioctl(fd_osd0, FBIOGET_VSCREENINFO, &osd0_varInfo) < 0) {
                printf("\nFailed FBIOGET_VSCREENINFO");
                return;
        }

        /* Modify the resolution and bpp as required */
        osd0_varInfo.bits_per_pixel = 16;

        /* Set vid0 window format */
        if (ioctl(fd_osd0, FBIOPUT_VSCREENINFO, &osd0_varInfo) < 0) {
                printf("\nFailed FBIOPUT_VSCREENINFO");
                return;
        }
	
	osd0_display[0] = (char *) mmap(NULL,
                                        osd0_fixInfo.line_length * osd0_varInfo.yres_virtual,
                                        PROT_READ | PROT_WRITE,
                                        MAP_SHARED, fd_osd0, 0);
	osd1_display[0] = (char *) mmap(NULL,
                                        osd1_fixInfo.line_length * osd1_varInfo.yres_virtual,
                                        PROT_READ | PROT_WRITE,
                                        MAP_SHARED, fd_osd1, 0);
	vid1_display[0] = (char *) mmap(NULL,
                                        vid1_fixInfo.line_length * vid1_varInfo.yres_virtual,
                                        PROT_READ | PROT_WRITE,
                                        MAP_SHARED, fd_vid1, 0);

	memset(osd0_display[0], 0x00, osd0_fixInfo.line_length * osd0_varInfo.yres_virtual);
	memset(osd1_display[0], 0x66, osd1_fixInfo.line_length * osd1_varInfo.yres_virtual);
	memset(vid1_display[0], 0x80, vid1_fixInfo.line_length * vid1_varInfo.yres_virtual);

	munmap(osd0_display[0], osd0_fixInfo.line_length * osd0_varInfo.yres_virtual);
	munmap(osd1_display[0], osd1_fixInfo.line_length * osd1_varInfo.yres_virtual);
	munmap(vid1_display[0], vid1_fixInfo.line_length * vid1_varInfo.yres_virtual);

        /*if (ioctl(fd_vid1, FBIO_ENABLE_DISPLAY, VPBE_ENABLE) < 0) {
                printf("\nFailed  FBIO_ENABLE_DISPLAY");
                close(fd_vid1);
                return FAILURE;
        }*/	
	system("cat /dev/zero > /dev/fb/2 2> /dev/null"); 
	system("../../../putimage ../../../davinci.yuv");
	
	DBGEXIT;
}

/* ************************************************************************/

void Initialize_Capture(void)
{
	printf("initializing capture device\n");
	InitCaptureDevice();
	printf("setting data format\n");
	SetDataFormat();
	printf("initializing capture buffers\n");
	InitCaptureBuffers();
	printf("initializing display device\n");
	StartStreaming();
}

/* ************************************************************************/
int StartLoop(void)
{
	struct v4l2_buffer buf;
	static int captFrmCnt = 0;
	char *ptrPlanar = NULL;
	int dummy;

	//StartStreaming();

	ptrPlanar = (char *) calloc(1, nWidthFinal * nHeightFinal * 2);

	while (!quit) {
		fd_set fds;
		struct timeval tv;
		int r;

		if (stress_test) {
			startLoopCnt--;
			if (startLoopCnt == 0) {
				startLoopCnt = 50;
				break;
			}
		}

		FD_ZERO(&fds);
		FD_SET(fdCapture, &fds);

		/* Timeout. */
		tv.tv_sec = 2;
		tv.tv_usec = 0;

		r = select(fdCapture + 1, &fds, NULL, NULL, &tv);

		if (-1 == r) {
			if (EINTR == errno)
				continue;

			printf("StartCameraCaputre:select\n");
			return -1;
		}

		if (0 == r) {
			continue;
		}

		CLEAR(buf);
		buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -