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

📄 loopback_ntsc_sv.c

📁 德州仪器新推出的达芬奇技术dm355的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
	  printf ("InitCaptureBuffers:mmap:\n");
	  return -1;
	}
      //printf("buffer:%d addr:%x\n",nIndex,buffers[nIndex].start);
    }

  return 0;
}

/* ************************************************************************/
static int
StartStreaming (void)
{
  int i = 0;
  enum v4l2_buf_type type;

  for (i = 0; i < nBuffers; i++)
    {
      struct v4l2_buffer buf;
      CLEAR (buf);
      buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
      buf.memory = V4L2_MEMORY_MMAP;
      buf.index = i;
      printf ("Queing buffer:%d\n", i);

      if (-1 == ioctl (fdCapture, VIDIOC_QBUF, &buf))
	{
	  printf ("StartStreaming:ioctl:VIDIOC_QBUF:\n");
	}
    }
  /* all done , get set go */
  type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  if (-1 == ioctl (fdCapture, VIDIOC_STREAMON, &type))
    {
      printf ("StartStreaming:ioctl:VIDIOC_STREAMON:\n");
    }

  return 0;
}

void *getDisplayBuffer(int fd)
{
	int ret, i;
	struct v4l2_buffer buf;

	memset(&buf, 0, sizeof(buf));
	buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
	ret = ioctl(fd, VIDIOC_DQBUF, &buf);
	if (ret < 0) {
		perror("VIDIOC_DQBUF\n");
		for (i = 0; i < numbuffers; i++)
			munmap(disp_buff_info[i].start,
				disp_buff_info[i].length);
		close(fd);
		return NULL;
	}
#if 0
	printf("getDisplayBuffer, index = %d, sec = %d, uSec = %d",buf.index, buf.timestamp.tv_sec,buf.timestamp.tv_usec);
#endif
	return disp_buff_info[buf.index].start;
}

int putDisplayBuffer(int fdx,void *addr)
{
	struct v4l2_buffer buf;
	int i, index = 0, found = 0;
	int ret;

	if (addr == NULL)
		return -1;
	memset(&buf, 0, sizeof(buf));

	for (i = 0; i < numbuffers; i++) {
		if (addr == disp_buff_info[i].start) {
			index = disp_buff_info[i].index;
			break;
		}
	}

	buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
	buf.memory = V4L2_MEMORY_MMAP;
	buf.index = index;
	ret = ioctl(fdx, VIDIOC_QBUF, &buf);

	if (ret)
		return ret;

	return 0;
}

/* ************************************************************************/
static int
DisplayFrame (int fdz, void *ptrBuffer)
{
  int y,i;
  int xres, yres;
  int fd;
  void *buf_new;
  int ret;
  unsigned int *f;
  unsigned int lp;
  unsigned int a1,a2;
  struct timeval tv;
  struct timezone zone;
  char *src, *dest;
  unsigned int line_length = 720*2;


  buf_new = getDisplayBuffer(fdz);

  if (buf_new == NULL)
  {
	printf("Error in getting display buffer\n");
	exit(0);
  }

      

#if 0
	  bzero((void *)&zone, sizeof (struct timezone));
	  gettimeofday(&tv,&zone);
	  printf("before memcpy sec=%d,usec=%d\n",tv.tv_sec,tv.tv_usec);
#endif
//      memcpy(buf_new,ptrBuffer,720*480*2);

	  src = ptrBuffer;
	  dest = buf_new;
	  for (i=0; i < 480; i++)
	  {
		  memcpy (dest,src,(720*2));
		  dest += line_length;
		  src += line_length;
      }
		 
#if 0
	  gettimeofday(&tv,&zone);
	  printf("after memcpy sec=%d,usec=%d\n",tv.tv_sec,tv.tv_usec);
#endif
      
#if 0

//changes to flip the buffer
	if(format==0)
        { 
	f=(unsigned int *)&buf_new[0];

        for(lp=0;lp<720*240;lp=lp+1)
		{
		
                 a1=*(f+lp);
                 a2=a1;
                 a1=a1&0x00ff00ff;
    
                 a2=a2&0xff00ff00;

                 a1=a1<<8;


                 a2=a2>>8;
                // a2=a2&0xffffff;


                 a1=a1|a2;
		 *(f+lp)=a1;
		}
	}

#endif

	ret=putDisplayBuffer(fdz,buf_new); 

  	if (ret < 0)
  	{
		printf("Error in put display buffer\n");
		return ret;
  	}
  	return 0;
}

/* ************************************************************************/
int
FlipBitmapBuffers (int fd, int nBufIndex)
{
  struct fb_var_screeninfo vInfo;
  int dummy;
  if (ioctl (fd, FBIOGET_VSCREENINFO, &vInfo) < -1)
    {
      printf ("FlipbitmapBuffers:FBIOGET_VSCREENINFO\n");
      printf ("\n");
      return -1;
    }

  vInfo.yoffset = vInfo.yres * nBufIndex;
  /* Swap the working buffer for the displayed buffer */
  if (ioctl (fd, FBIOPAN_DISPLAY, &vInfo) < -1)
    {
      printf ("FlipbitmapBuffers:FBIOPAN_DISPLAY\n");
      printf ("\n");
      return -1;
    }

  return 0;
}

/* ************************************************************************/
int
FlipVideoBuffers (int fd, int nBufIndex)
{
  struct fb_var_screeninfo vInfo;
  if (ioctl (fd, FBIOGET_VSCREENINFO, &vInfo) < -1)
    {
      printf ("FlipVideoBuffers:FBIOGET_VSCREENINFO\n");
      printf ("\n");
      return -1;
    }

  vInfo.yoffset = vInfo.yres * nBufIndex;
  /* Swap the working buffer for the displayed buffer */
  if (ioctl (fd, FBIOPAN_DISPLAY, &vInfo) < -1)
    {
      printf ("FlipVideoBuffers:FBIOPAN_DISPLAY\n");
      printf ("\n");
      return -1;
    }

  return 0;
}

/* ************************************************************************/
static void
StreamOnOff (int VideoOn)
{
  int i;
  enum v4l2_buf_type type;

  if (VideoOn == 1)
    {
      for (i = 0; i < nBuffers; i++)
	{
	  struct v4l2_buffer buf;

	  CLEAR (buf);
	  buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	  buf.memory = V4L2_MEMORY_MMAP;
	  buf.index = i;
	  printf ("Queing buffer:%d\n", i);

	  if (-1 == ioctl (fdCapture, VIDIOC_QBUF, &buf))
	    {
	      printf ("1StartStreaming:ioctl:VIDIOC_QBUF: \n");
	    }
	}
      printf ("After QBUF \n");
      type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
      if (-1 == ioctl (fdCapture, VIDIOC_STREAMON, &type))
	{
	  printf ("StopStreaming:ioctl:VIDIOC_STREAMOFF\n");
	}
    }
  else if (VideoOn == 0)
    {
      type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
      if (-1 == ioctl (fdCapture, VIDIOC_STREAMOFF, &type))
	{
	  printf ("StopStreaming:ioctl:VIDIOC_STREAMOFF\n");
	}
    }
}


int init_vid_device(int fd)
{
	struct v4l2_requestbuffers req;
	struct v4l2_buffer buf;
	int a, ret, i,j;
	struct v4l2_format fmt;
	req.count = numbuffers;
	req.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
	req.memory = V4L2_MEMORY_MMAP;
	v4l2_std_id std_id;

	std_id = V4L2_STD_525_60; // for PAL
	ret = ioctl(fd, VIDIOC_S_STD, &std_id);
	if (ret) {
		perror("VIDIOC_S_STD\n");
		close(fd);
		exit(0);
	}

	printf("Initializing Display Device\n");
	ret = ioctl(fd, VIDIOC_REQBUFS, &req);
	if (ret) {
		perror("cannot allocate memory\n");
		close(fd);
		exit(0);

	}


	disp_buff_info =
		(struct buffer *) malloc(sizeof(struct buffer ) * req.count);
	if (!disp_buff_info) {
		printf("cannot allocate memory for buff_info\n");
		close(fd);
		exit(0);
	}

	for (i = 0; i < req.count; i++) {
		buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
		buf.index = i;
		ret = ioctl(fd, VIDIOC_QUERYBUF, &buf);
		if (ret) {
			perror("VIDIOC_QUERYCAP\n");
			for (j = 0; j < i; j++)
				munmap(disp_buff_info[j].start,
						disp_buff_info[j].length);
			close(fd);
			exit(0);
		}
		disp_buff_info[i].length = buf.length;
		disp_buff_info[i].index= buf.index;

		disp_buff_info[i].start =
			mmap(NULL, buf.length, PROT_READ | PROT_WRITE,
					MAP_SHARED, fd, buf.m.offset);

		if ((unsigned int) disp_buff_info[i].start ==
				MAP_SHARED) {
			printf("Cannot mmap = %d buffer\n", i);
			for (j = 0; j < i; j++)
				munmap(disp_buff_info[j].start,
						disp_buff_info[j].length);
			close(fd);
			exit(0);
		}
	}

	fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
//	fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;	
	fmt.fmt.pix.width = 720;
	fmt.fmt.pix.height = 480;
	fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;

if(format==0)
  {
  fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
  }
  else
  { 
  fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
  }





	ret = ioctl(fd, VIDIOC_S_FMT, &fmt);
	if (ret) {
		perror("VIDIOC_S_FMT\n");
		close(fd);
		exit(0);
	}


	/* Enqueue buffers */
	for (i = 0; i < req.count; i++) {
		buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
		buf.index = i;
		buf.memory = V4L2_MEMORY_MMAP;
		ret = ioctl(fd, VIDIOC_QBUF, &buf);
		if (ret) {
			perror("VIDIOC_QBUF\n");
			for (j = 0; j < req.count; j++)
				munmap(disp_buff_info[j].start,
						disp_buff_info[j].length);
			exit(0);
		}
	}

	a = 0;
	ret = ioctl(fd, VIDIOC_STREAMON, &a);
	if (ret < 0) {
		perror("VIDIOC_STREAMON\n");
		for (i = 0; i < req.count; i++)
			munmap(disp_buff_info[i].start, disp_buff_info[i].length);
		exit(0);
	}
	printf("Enabled streaming on display device\n");
		
}

/******************************************************************************
 * Example to show vid1 in YUV format,OSD0 in RGB565 format and OSD1 is attribute
 * format.
 ******************************************************************************/
int
vpbe_UE_1()
{
  int ret = 0;
  int i;

  DBGENTER;

  Initialize_Capture ();

  test_data.vid1_width = 720;
  test_data.vid1_height = 480;
  test_data.vid1_xpos = 0;
  test_data.vid1_ypos = 0;
  test_data.vid1_hzoom = 0;	
  test_data.vid1_vzoom = 0;

  if ((init_vid_device (fdglobal)) < 0)
    {
      printf ("\nFailed to init vid1 window ");
      return FAILURE;
    }

#if 0
  if (mmap_vid1 () == FAILURE)
    return FAILURE;
#endif

  StartLoop ();

  /* unmap video buffers */
#if 0
  if (unmap_and_disable (VID1) < 0)
    return FAILURE;
#endif

  DBGEXIT;
  return ret;
}

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

close_all_windows ()
{

close(fdglobal);
}

int
open_all_windows (int s1)
{
  int result = 0;

  if(s1==0)
  {
  	if ((fdglobal = open (V4L2VID0_DEVICE, O_RDWR)) < 0)
    	{
		goto open_all_exit;
	}
  }
  else if(s1==1)
  {

  	if ((fdglobal = open (V4L2VID1_DEVICE, O_RDWR)) < 0)
	{
    		goto open_all_exit;
	}
  }
	

  return 0;
open_all_exit:
  close_all_windows ();
  return -1;
}

/******************************************************************************/
/* main function */
int
main (int argc, char *argv[])
{
    char shortoptions[] = "c:n:t:";
    char type;
    int testcase, no, index, c, ret = 0,d;
    int mode = O_RDWR;
    
    DBGENTER;

	
  	for (;;) 
	{
		d = getopt_long(argc, argv, shortoptions, (void *) NULL,
				&index);
		if (-1 == d)
			break;
		switch (d) {
			case 0:
				break;
			case 'c':
			case 'C':
				ch_no = atoi(optarg);
				break;
			case 'N':
			case 'n':
				numbuffers = atoi(optarg);
				break;
		        case 'T':
			case 't':
				format = atoi(optarg);
				break;

			default:
				usage();
				exit(1);
		}
	}
	
	if (!IS_VALID_CHANNEL(ch_no)) {
		printf("Invalid channel id \n");
		exit(0);
	}
	if (numbuffers < 0) {
		printf("Invalid numbufers \n");
		exit(0);
	}

        if((format < 0)||(format > 1))
        {
		printf("Invalid Format \n");
                exit(0);
        }


    if (open_all_windows (ch_no) != 0)
    {
        printf ("Test fail\n");
        return 0;
    }

    /* Process command line parameters */
    ret = vpbe_UE_1();

    
    close_all_windows ();
    DBGEXIT;
    return 0;
}

⌨️ 快捷键说明

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