文档章节

JpegDecoder--Jpeg文件解码程序

t
 tigerBin
发布于 2017/07/05 13:08
字数 788
阅读 182
收藏 0

Source: http://git.oschina.net/SilentCode/JpegCodecs

性能分析: gprof main.exe > profile.txt

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 13.40      0.13     0.13                             _spin_lite_unlock
 12.37      0.25     0.12                             std::string::compare(std::string const&)
 12.37      0.37     0.12                             _spin_lite_lock
 10.31      0.47     0.10                             __pthread_self_lite
  9.28      0.56     0.09                             std::_Rb_tree<std::string,
  8.25      0.64     0.08                             Transform(int*)
  4.12      0.68     0.04                             std::less<std::string>::operator()
  3.09      0.71     0.03                             std::_Rb_tree<std::string, 
  3.09      0.74     0.03                             bool std::operator< <char, 
  3.09      0.77     0.03                             __fpclassify
  2.06      0.79     0.02                             ConvertClrSpace
  2.06      0.81     0.02                             std::_Select1st
  2.06      0.83     0.02                             std::_Rb_tree_iterator
  2.06      0.85     0.02                             std::_Rb_tree
  2.06      0.87     0.02                             round
  1.03      0.88     0.01        1    10.00    10.00  Encoder(unsigned char*, int, int, int&)
  1.03      0.89     0.01                             SetLastError@4
  1.03      0.90     0.01                             ComputeRealValue(int)
  1.03      0.91     0.01                             UpSample(int*, int*)
  1.03      0.92     0.01                             std::_Rb_tree
  1.03      0.93     0.01                             std::string
  1.03      0.94     0.01                             std::_Rb_tree
  1.03      0.95     0.01                             std::_Rb_tree
  1.03      0.96     0.01                             pthread_getspecific
  1.03      0.97     0.01                             pthread_setspecific
  0.00      0.97     0.00        1     0.00     0.00  SetBitmapInfo(unsigned int, int, int)
  0.00      0.97     0.00        1     0.00     0.00  Write(char const*, unsigned char*, int&)
  0.00      0.97     0.00        1     0.00     0.00  Matrix()

可以看出,解码一张图片大约 1s 钟,而实际用于解码的时间不到 0.5s ,这是因为STL容器里面加入了很多安全与多线程相关的操作,这些额外的开销增加了解码的时间

下面是基于我实现的 tinyMap 解码后的结果:

Source:https://github.com/lzb-cc/JpegCodecs

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 23.73      0.14     0.14    48960     0.00     0.00  JpegDecoder::Transform(int*)
 15.25      0.23     0.09                             round
 13.56      0.31     0.08  2092962     0.00     0.00  tinyMap::find(int)
 10.17      0.37     0.06     8160     0.01     0.01  ConvertClrSpace(unsigned char*, int, int)
  8.47      0.42     0.05  2333318     0.00     0.00  NextBit()
  5.08      0.45     0.03        1    30.00    30.00  Encoder(unsigned char*, int, int, int&)
  5.08      0.48     0.03                             __fpclassify
  3.39      0.50     0.02    48960     0.00     0.00  Dequant(int*, unsigned char*)
  3.39      0.52     0.02    48960     0.00     0.00  UnZigZag(int*, int*)
  3.39      0.54     0.02    16320     0.00     0.00  UpSample(int*, int*)
  1.69      0.55     0.01  1776506     0.00     0.00  tinyStl::tinyMap::find(int, int)
  1.69      0.56     0.01   316456     0.00     0.00  FindKeyValue(tinyStl::tinyMap&)
  1.69      0.57     0.01   267496     0.00     0.00  ComputeRealValue(int)
  1.69      0.58     0.01    48960     0.00     0.00  DecoderBlock
  1.69      0.59     0.01                             _spin_lite_lock
  0.00      0.59     0.00  1776506     0.00     0.00  tinyStl::tinyMap::end()
  0.00      0.59     0.00   316456     0.00     0.00  tinyStl::tinyMap::operator[](int)
  0.00      0.59     0.00    26214     0.00     0.00  tinyStl::MapNode::Less(tinyStl::MapNode*)
  0.00      0.59     0.00     8160     0.00     0.04  JpegCodec::JpegDecoder::DecoderMCU()
  0.00      0.59     0.00     8160     0.00     0.00  FillYCbCr()
  0.00      0.59     0.00      680     0.00     0.00  GrandParent(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  RBNode()
  0.00      0.59     0.00      348     0.00     0.00  Check1(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  Insert(tinyStl::RBNode*)
  0.00      0.59     0.00      348     0.00     0.00  insert(int, int, int)
  0.00      0.59     0.00      344     0.00     0.00  Check2(tinyStl::RBNode*)
  0.00      0.59     0.00      344     0.00     0.00  AddToTree(tinyStl::RBNode*, tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  RBTree::Uncle(tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  Check3(tinyStl::RBNode*)
  0.00      0.59     0.00      340     0.00     0.00  Check4(tinyStl::RBNode*)
  0.00      0.59     0.00        4     0.00     0.00  RBTree()
  0.00      0.59     0.00        4     0.00     0.00  tinyMap()
  0.00      0.59     0.00        4     0.00     0.00  ReBuildTable(int, tinyStl::tinyMap&)
  0.00      0.59     0.00        3     0.00     0.00  MarkIndex(unsigned char)
  0.00      0.59     0.00        1     0.00     0.00  SetBitmapInfo(unsigned int, int, int)
  0.00      0.59     0.00        1     0.00     0.00  Write(char const*, unsigned char*, int&)
  0.00      0.59     0.00        1     0.00     0.00  ComputeDHT()
  0.00      0.59     0.00        1     0.00     0.00  ReadImageSize()
  0.00      0.59     0.00        1     0.00     0.00  ToStartOfData()
  0.00      0.59     0.00        1     0.00     0.00  ReadQuantTable()
  0.00      0.59     0.00        1     0.00   430.00  Decoder(JpegCodec::Matrix&)
  0.00      0.59     0.00        1     0.00     0.00  JpegDecoder(char const*)
  0.00      0.59     0.00        1     0.00     0.00  ~JpegDecoder()
  0.00      0.59     0.00        1     0.00     0.00  Create(int, int, int)
  0.00      0.59     0.00        1     0.00     0.00  Matrix::Matrix()

与使用STL相比,性能有了明显的提升

测试代码:

// main.cpp
#include <stdio.h>
#include "JpegDecoder.h"
#include "BmpEncoder.h"

using namespace JpegCodec;

int main(int argc, char *argv[])
{
	if (argc < 3)
	{
		printf("Usage: main input.jpg out.bmp\n");
		return 0;
	}
	/* 解码 Jpeg 文件 */
	JpegDecoder decoder(argv[1]);
	Matrix mat;
    	decoder.Decoder(mat);

	/* 保存为 Bitmap 格式图像 */
	int size;
	unsigned char *bitmap = Encoder(mat.data, mat.rows, mat.cols, size);
	Write(argv[2], bitmap, size);
	return 0;
}

 

© 著作权归作者所有

t
粉丝 1
博文 68
码字总数 21802
作品 0
武汉
程序员
私信 提问
加载中

评论(0)

常见图片格式详解(三)---JPEG

JPEG简介 JPEG是一种比较成熟的有损的图像压缩格式,经过JPEG压缩,图像质量会有所损失,但是,人眼不容易分辨出来这种差别。jpeg图像在质量和存储空间得到了一个相对平衡的状态。不过jpeg文...

mmlf
2018/03/19
0
0
iOS的图片:解码(CPU)与内存(缓存)

图片的数据:资源数据(地址)、原始数据(Data)、显示数据(解码后的数据) 解压图片 - PNG或者JPEG压缩之后的图片文件会比同质量的位图小得多。但是在图片绘制到屏幕上之前,必须把它扩展...

osc_mcgiza9x
2019/01/28
7
0
英伟达开源数据增强和数据解码库,解决计算机视觉性能瓶颈

     新智元编译   来源:NVIDIA   编辑:肖琴   【新智元导读】在CVPR 2018大会上,英伟达开源了数据增强库DALI和数据解码库nvJPEG。   在CVPR 2018大会上,英伟达开源了数据增...

深度学习
2018/06/25
0
0
NIOS2随笔——JPEG解码与VGA显示

1. 系统概述 本设计采用NIOS2 32位处理器,通过SPI接口将SD/TF卡中的JPEG图片数据读取到内存中,SD/TF卡的文件系统为FAT32,NIOS2软件实现JPEG解码后,启动framereader和Clocked Video Outpu...

shugenyin
2017/01/08
0
0
数据压缩实验五 JPEG原理分析及JPEG解码器的调试

一、实验原理 1、JPEG图像压缩标准基本介绍 JPEG 是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同...

zgyggy
2017/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

daily work report on May 25,2020

React-Native工程师 岗位要求 1、三年以上基于React-Native技术完成电商平台app混合开发实际工作经验,熟悉电商平台相关业务。 2、能熟练掌握React-Native,并能基于该技术独立完成相关工作,...

qwfys
13分钟前
23
0
HTTP/3 未来可期?

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"加群",加入新技术 2015 年 HTTP/2 标准发表后,大多数主流浏览器也于当年年底支持该标准。此后,凭借着多路复用、头部压缩、服务器推...

osc_3b0dcpcm
15分钟前
5
0
【原创】JVM系列01 | 开篇

  20大进阶架构专题每日送达   1. Java 虚拟机是什么? 1.1 虚拟机   虚拟机:虚拟的计算机,一个用来执行虚拟计算机指令的软件。   虚拟机分为系统虚拟机和程序虚拟机。   系统虚...

osc_0k23td2u
16分钟前
4
0
Flink 1.10 细粒度资源管理解析

相信不少读者在开发 Flink 应用时或多或少会遇到在内存调优方面的问题,比如在我们生产环境中遇到最多的 TaskManager 在容器化环境下占用超出容器限制的内存而被 YARN/Mesos kill 掉[1],再比...

osc_n0c6719w
17分钟前
17
0
IDEA使用技巧-->查看继承关系

在开发中项目庞大的时候你会不知道当前类在项目中的使用情况,在哪被继承?在哪被实现?和谁有关联? 快捷键 eclipse中是: ctrl+tidea中是: ctrl+H点击当前类, 然后ctrl+H...

宇宝
18分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部