c MJPG(1)

.读取量化表,全局参数,霍夫曼表,恢复表编码,现在只是实现思路。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
#include <linux/fb.h>
#include <stdlib.h>static unsigned char h0[100];int main(void) {FILE *f = fopen("/home/wjs/Pictures/1.jpg", "rb");if (f == NULL) {puts("file_in error");exit(-1);}fseek(f, 0, SEEK_END);int len = ftell(f);fseek(f, 0, SEEK_SET);int fd = fileno(f);unsigned char *p = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);puts("-----------量化表---------------------");for (int t = 0; t < len; t++) {if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xdb)) {//		printf("ffdb:%d\n", t);}}puts("-----------帧全局---------------------");for (int t = 0; t < len; t++) {if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xc0)) {//		printf("ffc0:%d\n", t);}}puts("------------霍夫曼表--------------------");for (int t = 0; t < len; t++) {if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xc4)) {//	printf("ffc4:%d\n",t);   //ff c4 (固定)0 1f(长度-2)0(表id)int cd = (*(p + t + 2)) * 256 + *(p + t + 3) - 3;unsigned char *hp = malloc(cd * (sizeof(char)));for (int n = 0; n < cd; n++) {*(hp + n) = *(p + t + 5 + n);//	printf("%d ",*(hp+n));}if (*(p + t + 4) == 0) {          //表1unsigned  char hfm0[cd];//	memcpy(&h0, hp, cd);}if (*(p + t + 4) == 16) {         //2unsigned  char hfm1[cd];//	memcpy(&h0,hp,cd);}if (*(p + t + 4) == 1) {           //3unsigned  char hfm2[cd];//	memcpy(&h0,hp,cd);}if (*(p + t + 4) == 17) {          //4unsigned  char hfm3[cd];memcpy(&h0,hp,cd);}printf("\n");free(hp);}}puts("------------差分数据--------------------");for (int t = 0; t < len; t++) {if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xdd)) {//		printf("ffdd:%d\n", t);}}puts("------------扫描数据--------------------");for (int t = 0; t < len; t++) {if ((*(p + t) == 0xff) && (*(p + t + 1) == 0xda)) {//		printf("ffda:%d\n", t);}}
//----------------------------------------------------------------------//h0[26]// 0 1 2 3 4 5 6 7 8 9 10        15//0 1 5 1 1 1 1 0 0 0 0 0 0 0 0 0      0 1 4 5 6 7 3 2 8 9int bm[100];int t = 0;  //输出数组递增数int n = 1;  //内存递增数if (h0[n] == 1) {bm[t] = 0;} else if (h0[n] == 2) {bm[t] = 0;             //生成2 位   0,1t = t + 1;bm[t] = 1;}for(int q=0;q<15;q++){n = n + 1;if (h0[n] != 0) {  //3   2,3,4,5,6t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}}
/*	n = n + 1;if (h0[n] != 0) {  //4  (6+1)*2=14t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //5    (14+1)*2=30t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //6     (30+1)*2=62t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //7位    (62+1)*2=126t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //8t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //9t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //10t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //11t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //12t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //13t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //14t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}n = n + 1;if (h0[n] != 0) {  //15t = t + 1;bm[t] = 2 * (bm[t - 1] + 1);for (int z = 0; z < (h0[n] - 1); z++) {t = t + 1;bm[t] = bm[t - 1] + 1;}}*/	for (int t = 0; t < 100; t++) {printf("%d   ", bm[t]);}return 0;
}

 Jpeg 用的是范式霍夫曼,可以00 开始推算出码表。

7现在又有一问题,ffda的扫描流中含有Y  和UV两种的交流与直流4个部分,怎样才能区分开这4部分。

搞清楚了码流结构才能试着用上面的码表解码。

一个正常的JPEG码流以SOI(FFD8)标记开始,以EOI(FFD9)标记结束,中间是一帧的图像信息,包括各种数据(如 huffman表FFC4部分,量化表FFC0部分,以及APP和COM等部分)和SCAN部分(FFDA部分)等。JPEG图像包含一个或者多个SCAN(progressive模式包含多个SCAN),一个SCAN下面有一个或者多个RST(Restart Interval),一个RST里有一个或者多个MCU,一个MCU里有一个或者多个Block。

细读rfc2435   jpeg定义标准

1a4ba39ca1804d9a9b483f1f26071272.jpg

 主要找SOS段的详细资料信息

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/233795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.网络编程基础知识 - 基础概念、TCP网络通信、UDP网络通信

网络编程 文章目录 网络编程一、概念1.1 网络1.2 IP地址1.2.1 IPv4 介绍1.2.2 IPv6 介绍1.2.3 查看IP地址 1.3 域名和端口1.4 网络协议1.5 TCP与UDP1.6 InetAddress类1.7 Socket 二、TCP网络通信编程2.1 介绍2.2 案例2.2.1 字节流编程案例12.2.2 字节流编程案例22.2.3 字符流编…

项目终验的exce表格缩放,排版等经常使用

xxx个项目的验收资料 1.申请表等等很多信息 需求&#xff1a;放在一页内等办法 上述文档&#xff0c;在excel表格打印预览中都是在两页中&#xff0c;很难调节&#xff0c;这个时候采用wps专业版本即可。 wps排版经常使用的功能如下&#xff1a; 经常使用的是 1.把所有列打印…

骨传导与入耳式耳机哪种音质好?骨传导与入耳式耳机有什么区别?

由于骨传导耳机和入耳式耳机的传声原理不同&#xff0c;入耳式耳机的音质要更好一些&#xff01; 想要了解骨传导耳机和入耳式耳机哪种音质好&#xff0c;首先就要了解骨传导耳机和入耳式耳机的传声原理有什么区别&#xff1f; 一、骨传导耳机和入耳式耳机有什么区别 1、传声…

MySQL与其他数据库产品的比较,优势在哪里?

作为数据库管理领域的博主作家&#xff0c;我深知数据库在软件开发和数据管理中的重要性。在当今众多的数据库产品中&#xff0c;MySQL作为一种流行的开源关系型数据库管理系统&#xff0c;具有许多优势和特点。下面&#xff0c;我将通过对与其他数据库产品的比较以及MySQL的优…

【JavaEE】线程安全与线程状态

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

牛客算法心得——abb(dp)

大家好&#xff0c;我是晴天学长&#xff0c;传智杯的题&#xff0c;我准备写一个题解&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .abb leafee 最近爱上了 abb 型语句&#xff0c;比如“叠词词”、…

深入探索Maven:优雅构建Java项目的新方式(二)

Meven高级 1&#xff0c;属性1.1 属性1.1.1 问题分析1.1.2 解决步骤步骤1:父工程中定义属性步骤2:修改依赖的version 1.2 配置文件加载属性步骤1:父工程定义属性步骤2:jdbc.properties文件中引用属性步骤3:设置maven过滤文件范围步骤4:测试是否生效 1.3 版本管理 2&#xff0c;…

Xpath定位文本中含有空格的元素

可以使用XPath中的normalize-space函数来定位文本中含有空格的元素。主要包含normalize-space(.)、normalize-space(text())两种用法&#xff1a; 使用 normalize-space(.) 的例子&#xff1a; <root><element>Hello, world!</element> </root>在上述…

从实践角度深入探究数据驱动和关键字驱动测试方法!

数据驱动 数据驱动&#xff0c;指在软件测试领域当中的数据驱动测试&#xff08;Data-Driven Testing&#xff0c;简称DDT&#xff09;是⼀种软件测试⽅法&#xff0c;在不同的数据下重复执⾏相同顺序的测试步骤&#xff0c;测试脚本从数据源读取测试数据&#xff0c;⽽不使⽤…

轻型载重汽车转向前桥总成系统毕业设计机械设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;前桥 获取完整说明报告工程源文件 绪论 1.1 轻型载重汽车转向桥的设计意义 汽车是现代交通工具中用得最多&#xff0c;最普遍&#xff0c;也是最方便的交通运输工具。汽车转向系是汽车上的一个重要系统,它是汽车转向运动…

「Python编程基础」第5章:列表

文章目录 一、为什么要有列表&#xff1f;二、列表语法三、用索引获取列表中的单个值四、利用切片取得子列表五、利用len()函数&#xff0c;获取列表的长度六、利用索引改变列表中的值七、列表的连接和复制八、用del语句删除列表中的值九、有了列表后&#xff0c;真香十、列表的…

Jenkins持续集成Python项目

一、前言   之前学习了很多自动化测试框架&#xff0c;但是写的脚本都是本地执行&#xff0c;多数用来造数据。最近公司掀起一股自动化测试的风&#xff0c;所以就想研究下如何集成jenkins&#xff0c;本次采用pytest&#xff0c;用的是阿里云服务器centos7。 二、服务器环境…