文档章节

YUYV422转YUV420

宇文成欣
 宇文成欣
发布于 2016/12/07 17:46
字数 481
阅读 53
收藏 1
点赞 0
评论 0

 这几天做一个音视频采集与传输的项目,用v4l2来采集视频数据,公司给的USB摄像头只支持packed yuyv422数据,需要将其转换为planar yuv420,折腾了一下,将代码贴出来,说不定有同学可以用到。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <sys/time.h>

uint32_t width = 1280;
uint32_t height = 720;

uint32_t getcurrenttime()
{
  struct timeval t;
  gettimeofday(&t, NULL);
  return (uint32_t)(t.tv_sec * 1000 + t.tv_usec / 1000);
}

int convert(uint8_t *inbuf, const uint32_t buflen, uint8_t *outbuf)
{
  uint8_t *y = NULL;
  uint8_t *u = NULL;
  uint8_t *v = NULL;
  y = outbuf;
  u = y + 1280 * 720;
  v = u + 1280 * 720 / 2;

  uint32_t i = 0;
  uint8_t swith = 0;
  while (i < buflen) {
    if (swith == 0 || swith == 2) {
      *y++ = inbuf[i];
      swith++;
    } else if (swith == 1) {
      *u++ = inbuf[i];
      swith++;
    } else if (swith == 3) {
      *v++ = inbuf[i];
      swith = 0;
    }
    i++;
  }
  return 0;
}

void yuyv2yuv420(uint8_t *inbuf, const uint32_t buflen, uint8_t *outbuf)
{
  uint8_t *y = NULL;
  uint8_t *u = NULL;
  uint8_t *v = NULL;
  int u_c = 0;
  int v_c = 0;
  y = outbuf;
  u = y + 1280 * 720;
  v = u + 1280 * 720 / 4;
  bool swith = true;
  uint32_t i = 0, j = 0;

  for (i = 0; i < buflen; i += 2) {
    *y++ = inbuf[i];
  }
  
  for (i = 0; i < height; i += 2) {
    for (j = 1; j < width << 1; j += 2) {
      if (swith) {
        *u++ = ((uint8_t *)(inbuf + (i * (width << 1))))[j];
        swith = false;
        u_c++;
      } else {
        *v++ = ((uint8_t *)(inbuf + (i * (width << 1))))[j];
        swith = true;
        v_c++;
      }
    }
  }
}

int main()
{
  int ret = 0;
  uint32_t inframesize = width * height * 2; 
  uint32_t outframesize = width * height * 3 / 2;
  printf("inframesize: %u\n", inframesize);
  printf("outframesize: %u\n", outframesize);
  printf("size: %u\n", width * height / 4);
  FILE *infb = NULL;
  FILE *outfb = NULL;
  uint8_t *inbuf = NULL;
  uint8_t *outbuf = NULL; 
  
  inbuf = (uint8_t *)malloc(sizeof(uint8_t) * inframesize);
  if (inbuf == NULL) {
    printf("malloc inbuf failed\n");
    ret = -1;
    goto Error;
  }
  outbuf = (uint8_t *)malloc(sizeof(uint8_t) * outframesize);
  if (outbuf == NULL) {
    printf("malloc outbuf failed\n");
    ret = -1;
    goto Error;
  }

  infb = fopen("./test.yuv", "rb");
  if (infb == NULL) {
    printf("open ./test.yuv failed\n");
    ret = -1;
    goto Error;
  }
  outfb = fopen("./test.yuv420", "wb");
  if (outfb == NULL) {
    printf("open ./test.yuv422 failed\n");
    ret = -1;
    goto Error;
  }

  uint32_t start;
  uint32_t end;
  while (fread(inbuf, 1, inframesize, infb) == inframesize) {
    //convert(inbuf, inframesize, outbuf);
    start = getcurrenttime();
    yuyv2yuv420(inbuf, inframesize, outbuf);
    end = getcurrenttime();
    printf("%d\n", end - start);
    fwrite(outbuf, 1, outframesize, outfb);
  }

Error:
  if (inbuf != NULL) free(inbuf);
  if (outbuf != NULL) free(outbuf);
  if (infb != NULL) fclose(infb);
  if (outfb != NULL) fclose(outfb);
  return ret;
}

代码中的convert函数,只是将packed yuyv422转换成planar。

 

 

 

© 著作权归作者所有

共有 人打赏支持
宇文成欣
粉丝 1
博文 3
码字总数 623
作品 0
绵阳
程序员
一款开源的 Android YUV 格式查看工具

1. YUVDroidTools 最近项目比较忙,好久没有写文章了,也没有为开源社区贡献点啥了,这个周末抽空整理了一下自己一直维护的一份基于 ffmpeg 的 YUV 格式转换代码,写了一个简单的 Android YU...

Jhuster
2016/06/25
0
0
一个简单的 YUV 播放器--YUVPlayer

工程说明 VS2010 MFC工程,源码有部分参考Yuvviewer代码,界面参考YUV Player Deluxe风格。 参数设置界面: 关于界面: 功能 可播放各种格式的YUV文件。 默认预留常见分辨率,同时支持自定义...

latelee
2017/03/29
417
1
YUV420如何扣取指定区域的图像数据

YUV420数据的存储方式有两类:planar和packed。planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。对于packed的YUV格式,每个像素点的Y,U,V是连续交...

Gobert
2014/12/04
0
0
YUV420如何扣取指定区域的图像数据

YUV420数据的存储方式有两类:planar和packed。planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。对于packed的YUV格式,每个像素点的Y,U,V是连续交...

IcedBeer
2016/11/03
86
0
图文详解YUV420数据格式

完整的链接: http://www.xuebuyuan.com/1541892.html YUV格式有两大类:planar和packed。 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。...

aspirs
2016/01/24
63
0
图文详解 YUV420 数据格式

YUV 格式有两大类:planar 和 packed。 对于 planar 的 YUV 格式,先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的 V。 对于 packed 的 YUV 格式,每个像素点的 Y,...

Jerikc
2015/10/03
221
0
入门视频采集与处理(学会分析YUV数据)(转载)

做视频采集与处理,自然少不了要学会分析YUV数据。因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264、MPEG视频编解码)的角度来说,也...

stefanliao
2013/01/04
0
0
YCrCb与YPrPb的含义与区别

对一种颜色进行编码的方法统称为"颜色空间"或"色域",RGB和YUV,都是颜色空间的种类, Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠 分量视频信号(色差信号),通常采用YCbCr...

u010468553
02/26
0
0
x264源码解析:码率控制之能量函数

最近刚好看到有人问,所以会以码率控制为主线,陆续分享一些源码分析。 h->pixf.var分别获取亮度和色度分量的ssd与sum 对于yuv420:亮度分量16x16,色度分量是8x8 对于yuv444:亮度分量16x16...

yue_huang
03/08
0
0
Hi3519V101色彩空间转换总结(一)

目录 前言 虽然只是做了点海思的应用层开发,但是对于各种颜色格式也有一定的了解。因为海思本身是格式的数据。在开发的过程中,要把的数据转换成数据,当然也是要用到。踩了很多坑,但最终成...

simonforfuture
2017/12/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java基础——异常

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 异常处理: 可以挖很多个陷阱,但是不要都是一样...

凯哥学堂
9分钟前
0
0
180723-Quick-Task 动态脚本支持框架之结构设计篇

Quick-Task 动态脚本支持框架之结构设计篇 相关博文: 180702-QuickTask动态脚本支持框架整体介绍篇 180719-Quick-Task 动态脚本支持框架之使用介绍篇 前面两篇博文,主要是整体介绍和如何使用...

小灰灰Blog
12分钟前
0
0
SBT 常用开发技巧

SBT 一直以来都是 Scala 开发者不可言说的痛,最主要的原因就是官方文档维护质量较差,没有经过系统的、循序渐进式的整理,导致初学者入门门槛较高。虽然也有其它构建工具可以选择(例如 Mill...

joymufeng
17分钟前
0
0
HBase in Practice - 性能、监控及问题解决

李钰(社区ID:Yu Li),阿里巴巴计算平台事业部高级技术专家,HBase开源社区PMC&committer。开源技术爱好者,主要关注分布式系统设计、大数据基础平台建设等领域。连续4年基于HBase/HDFS设计和...

中国HBase技术社区
18分钟前
1
0
ES18-JAVA API 批量操作

1.批量查询 Multi Get API public static void multiGet() {// 批量查询MultiGetResponse response = getClient().prepareMultiGet().add("my_person", "my_index", "1")// 查......

贾峰uk
22分钟前
0
0
SpringBoot2.0使用health

1,引入actuator <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> 2,application.properties ......

暗中观察
29分钟前
0
0
阿里巴巴Java开发规约

###编程规约 命名风格 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。...

简心
34分钟前
0
0
如何用TypeScript来创建一个简单的Web应用

转载地址 如何用TypeScript来创建一个简单的Web应用 安装TypeScript 获取TypeScript工具的方式: 通过npm(Node.js包管理器) npm install -g typescript 构建你的第一个TypeScript文件 创建...

durban
38分钟前
0
0
分享好友,朋友圈自定义分享链接无效

这个问题是微信6.5.6版本以后,修改了分享规则:分享的连接必须在公众号后台设定的js安全域名内

LM_Mike
56分钟前
0
0
2018年7月23日课程

一、LVS-DR介绍 director分配请求到不同的real server。real server 处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了...

人在艹木中
59分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部