关闭

V4L2应用编程之huffman table don't exist,empty input file问题解决办法

1690人阅读 评论(0) 收藏 举报
分类:

          最近在开始研究V4L2应用编程,网上找来一个embedsky的应用程序进行preview,第一次打开的时候是可以正常的preview,但是再次打开的时候提示:huffman table don't exist,empty input file。

        我想之所以会报错huffman table don't exist,是在下面这个判断函数中,从缓冲区取出的图像数据buffers中不符合下面这个条件,也就是缓冲区取出的数据有错

//check huffman table,these code are optional
for (i1=0; i1<buf.bytesused; i1++)
{
	if ((buffers[numBufs].start[i1] == 0x000000FF) && (buffers[numBufs].start[i1+1] == 0x000000C4))
	{
		break;
	}
}
if (i1 == buf.bytesused)
{
	printf("huffman table don't exist! \n");
	goto next_frame;

        //添加这句话表示如果huffman table don't exist的话表示采集的第一帧图像有问题,则跳转到next_frame的位置去执行

 //在next_frame位置,会重新将刚才从缓冲队列中取出的数据放入缓冲队列,等待下一次被取出
}

        那么我就暂时不用这次缓冲区取出的数据,重新将这个缓冲区放入到缓冲队列中去,等待下一次从缓冲队列中取出数据,解决的办法是在输出huffman table don't exist的地方让程序跳转到next_frame位置,在next_frame位置的函数将刚才取出的队列重新放入缓冲区

next_frame:
	//将取出的图像放回缓冲区
	memset(&buf, 0 ,sizeof(buf));
	buf.index = numBufs;
	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	buf.memory = V4L2_MEMORY_MMAP;
	if (ioctl(fd, VIDIOC_QBUF, &buf) < 0)
	{
		printf("VIDIOC_QBUF error\n");
		return -1;
	}

这样再次打开preview的时候还能继续preview,不知各位还有什么更好的解决办法?

下面是代码片段,完整的程序在:http://download.csdn.net/detail/luckywang1103/6664249



//预览采集到的图像
	while (1)
	{
		//如果把处理JPEG格式的数据和显示程序分离,把处理JPEG部分的数据作成一个新的线程,预览时会更加流畅。
		for (numBufs = 0; numBufs < req.count; numBufs++)
		{	
			if ((fd_y_file = fopen(s, "wb")) < 0)
			{
				printf("Unable to create y frame recording file\n");
				return -1;
			}
			
			memset(&buf, 0, sizeof(buf));
			buf.index = numBufs;
			buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;	//取得原始采集数据
			buf.memory = V4L2_MEMORY_MMAP;			//存储类型:V4L2_MEMORY_MMAP(内存映射)或V4L2_MEMORY_USERPTR(用户指针)
			if (ioctl(fd, VIDIOC_DQBUF, &buf) < 0)		//从缓冲队列中取出数据
			{
				perror("VIDIOC_DQBUF failed.\n");
				return -1;
			}

			unsigned char *ptcur = buffers[numBufs].start;	//开始霍夫曼解码
			int i1;
			//check huffman table,these code are optional
			for (i1=0; i1<buf.bytesused; i1++)
			{
				if ((buffers[numBufs].start[i1] == 0x000000FF) && (buffers[numBufs].start[i1+1] == 0x000000C4))
				{
					break;
				}
			}
			if (i1 == buf.bytesused)
			{
				printf("huffman table don't exist! \n");
				goto next_frame;
			}
			int i;
			//SOI = Start Of Image = "FFD8", EOI = End Of Image = "FFD9"
			for (i=0; i<buf.bytesused; i++)
			{
				if ((buffers[numBufs].start[i] == 0x000000FF) && (buffers[numBufs].start[i+1] == 0x000000D8))
					break;
				ptcur++;
			}
			int imagesize = buf.bytesused - i;

			fwrite(ptcur, imagesize, 1, fd_y_file);			//开始向LCD发送数据显示采集到的图像
			fclose(fd_y_file);

			if ((infile = fopen(s, "rb")) == NULL)
			{
				fprintf(stderr, "open %s failed\n", s);
				exit(-1);
			}
			cinfo.err = jpeg_std_error(&jerr);
			
			jpeg_create_decompress(&cinfo);
		
			//导入要解压的Jpeg文件infile
			jpeg_stdio_src(&cinfo, infile);
			
			//读取jpeg文件的文件头
			jpeg_read_header(&cinfo, TRUE);
			
			//开始解压Jpeg文件,解压后将分配给scanline缓冲区,
			jpeg_start_decompress(&cinfo);

			buffer = (unsigned char *) malloc(cinfo.output_width * cinfo.output_components);
			y = 0;
			while (cinfo.output_scanline < cinfo.output_height)
			{
				jpeg_read_scanlines(&cinfo, &buffer, 1);
				if (fbdev.fb_bpp == 16)
				{
					unsigned short color;
					for (x = 0; x < cinfo.output_width; x++)
					{
						color = RGB888toRGB565(buffer[x * 3],buffer[x * 3 + 1], buffer[x * 3 + 2]);
						fb_pixel(fbdev.fb_mem, fbdev.fb_width, fbdev.fb_height, x, y, color);///
					}
				}
				else if (fbdev.fb_bpp == 24)
				{
					memcpy((unsigned char *)fbdev.fb_mem + y * fbdev.fb_width * 3, buffer,
							cinfo.output_width * cinfo.output_components);
				}
				y++;//下一个scanline
			}

			//完成Jpeg解码,释放Jpeg文件
			jpeg_finish_decompress(&cinfo);
			jpeg_destroy_decompress(&cinfo);

			//释放帧缓冲区
			free(buffer);

			//关闭Jpeg输入文件
			fclose(infile);
 
next_frame:
			//将取出的图像放回缓冲区
			memset(&buf, 0 ,sizeof(buf));
			buf.index = numBufs;
			buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
			buf.memory = V4L2_MEMORY_MMAP;
			if (ioctl(fd, VIDIOC_QBUF, &buf) < 0)
			{
				printf("VIDIOC_QBUF error\n");
				return -1;
			}
		}
		
		//printf("start the next frame\n");
		if(stop_flag) 				
			break;
	}


0
0
查看评论

【数据压缩】Huffman原理与代码实现

Huffman算法也是一种无损压缩算法,但与上篇文章LZW压缩算法不同,Huffman需要得到每种字符出现概率的先验知识。通过计算字符序列中每种字符出现的频率,为每种字符进行唯一的编码设计,使得频率高的字符占的位数短,而频率低的字符长,来达到压缩的目的。通常可以节省20%~90%的空间,很大程度上依...
  • luoshixian099
  • luoshixian099
  • 2015-12-21 23:00
  • 6477

mybatis Table 'SYS_USER' doesn't exist

### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SYS_USER' doesn't exist 很明显提示表找不到。 那好,找项目中配置文件,发现表确实存在的...
  • zqbx7
  • zqbx7
  • 2016-11-11 16:22
  • 2547

mysql问题#1146 - Table 'xxx.xxxxx' doesn't exist

这次出现这个问题是由于博主手贱,误删mysql重要文件所致的. 在重装mysql后,进入mysql navicat发现之前的数据库中的表都无法使用了,尴尬探索之际发现,这个是由于重新安装mysql,导致其ibdata1更新无法导入data数据包中的数据库。 所幸博主比较机灵,在重装mysql之前对...
  • windflybird
  • windflybird
  • 2017-03-17 11:15
  • 383

[新手]hibernate 表不存在 MySQLSyntaxErrorException: Table doesn't exist

声明:适合新手,初学hibernate的同学参考...
  • ethansmart
  • ethansmart
  • 2014-10-13 20:04
  • 1647

关于链接mysql报MySQLSyntaxErrorException: Table ** doesn't exist的问题

最近在将公司部署在win上的集群迁移到CentOs上出现了好多问题,近期我也会对这些问题写一些总结,希望能够帮助到大家。 在我部署的时候出现了MySQLSyntaxErrorException: Table ** doesn't exist这个错。 但我在数据库里面确实看见了这个表的存在...
  • u010410135
  • u010410135
  • 2016-07-22 11:57
  • 3505

ubuntu 中下载openssh源码移植到 arm开发,出现you don't exist, go away问题的解决

前段日子移植openssh的痛苦经历, 让我下定决心开个博客记录每天问题的解决, 为以后的日子减少点麻烦 openssh 的移植, 我参考  http://blog.csdn.net/cuijianzhongswust/article/details/7090387 讲三个...
  • xuhilar
  • xuhilar
  • 2013-02-03 21:28
  • 1428

mysql mybatis Table 'db_gg.SYS_USER' doesn't exist

1、问题: Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:  Table 'db_gg.SYS_USER' doesn't exist 2、解决: 将mybatis的...
  • u014520797
  • u014520797
  • 2017-03-17 17:42
  • 1185

Units specified don't exist SHSUCDX can't install

unist specified don’t exist. shsucdx can’t install 翻译过来意思是:特定分区(单元)不存在,shsucdx不能安装 SHSUCDX(.COM)为dos下的光驱扩展程序,安装SATA光驱的程序。 导致出现这个问题的可能原因: 1、硬盘分区没有...
  • e_wsq
  • e_wsq
  • 2012-12-17 23:56
  • 1090

MySql - 导入数据时 Table XXX doesn't exist 的解决

数据表为Innodb引擎 data文件夹中存在数据表的frm文件,但在phpmyadmin中看不到这些表,于是采用导入sql文件的方式进行恢复 1、直接导入原数据表的sql文件,原frm文件不删除 出错:#1146 - Table 'eticket.et_admin' does...
  • w6611415
  • w6611415
  • 2012-03-30 23:26
  • 15629

1146 - Table 'xxx.xxx' doesn't exist

今天开始测试mysql的新版本,从生产mysql库中备份部分表到测试库中。 测试中发现,有些表可以查询出数据,但不能update,报1146,表不存在。 mysql> select version(); +------------+ | version()  | +----...
  • lwei_998
  • lwei_998
  • 2013-08-09 10:01
  • 9149
    个人资料
    • 访问:765186次
    • 积分:9957
    • 等级:
    • 排名:第2084名
    • 原创:237篇
    • 转载:140篇
    • 译文:2篇
    • 评论:128条
    最新评论