jpg转nv12_jpeg改jpg

jpg转nv12_jpeg改jpg代码主要用到了libyuv库和libjpeg库。编译:g++demo.cpp-lyuv-ljpeg-odemoubuntu下测试(需安装ffmpeg,width以及height按实际情况填写):ffplay-itest.yuv-pixel_formatnv12-swidthxheightdemo:#include<stdio.h>#include<stdlib.h>#include<libyuv.h>#..

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

代码主要用到了libyuv库和libjpeg库。

编译:

g++ demo.cpp -lyuv -ljpeg -o demo

ubuntu下测试(需安装ffmpeg,width以及height按实际情况填写): 

ffplay -i test.yuv -pixel_format nv12 -video_size widthxheight

demo: 

#include <stdio.h>
#include <stdlib.h>
#include <libyuv.h>

#define align_buffer_page_end(var, size)                                    \
    uint8_t* var##_mem =                                                    \
        reinterpret_cast<uint8_t*>(malloc(((size) + 4095 + 63) & ~4095));   \
    uint8_t* var = reinterpret_cast<uint8_t*>(                              \
        (intptr_t)(var##_mem + (((size) + 4095 + 63) & ~4095) - (size)) & ~63)

#define free_aligned_buffer_page_end(var)   \
    free(var##_mem);                        \
    var = 0

using namespace libyuv;

int main(int argc, char *argv[])
{
    int32_t width = 0, height = 0;

    FILE *dst;
    FILE *ori = fopen("test.jpg", "rb+");
    fseek(ori, 0, SEEK_END);
    uint32_t data_size = ftell(ori);
    fseek(ori, 0, SEEK_SET);
    uint8_t *data = (uint8_t *)calloc(1, data_size);
    fread(data, data_size, 1, ori);
    fclose(ori);

    int32_t ret = MJPGSize(data, data_size, &width, &height);
    int32_t half_width = (width + 1) / 2;
    int32_t half_height = (height + 1) / 2;

    align_buffer_page_end(dst_y, width * height);
    align_buffer_page_end(dst_uv, half_width * half_height * 2);

    ret = MJPGToNV12(data, data_size, dst_y, width, dst_uv, half_width * 2, width, height, width, height);
    if (0 == ret) {
        printf("change to nv12 success\n");
    } else {
        printf("change to nv12 failed\n");
        goto errChange;
    }

    dst = fopen("test.yuv", "wb+");
    fwrite(dst_y, width * height, 1, dst);
    fwrite(dst_uv, half_width * half_height * 2, 1, dst);
    fclose(dst);

errChange:
    free(data);
    free_aligned_buffer_page_end(dst_y);
    free_aligned_buffer_page_end(dst_uv);

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192969.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【mysql】锁详解

    【mysql】锁详解【mysql】锁详解

    2022年4月25日
    36
  • SQLyog客户端无法连接mysql「建议收藏」

    SQLyog客户端无法连接mysql「建议收藏」忘记截图了,只能描述下报错信息:Host ‘服务器地址’ is not allowed to connect to this MySQL server解决方法:添加用户权限1.登录服务端mysql2.在mysql输入命令GRANT ALL PRIVILEGES ON *.* TO ‘root’@’IP地址’ IDENTIFIED BY ‘你设置的密码’ WITH GRANT O…

    2022年8月18日
    19
  • C++学习——动态内存分配「建议收藏」

    C++学习——动态内存分配「建议收藏」文章目录何为静态内存分配?为什么需要动态内存分配解决方法:动态内存分配动态申请内存操作符 newnew 类型名T(初始化参数列表)释放内存操作符deletedelete 指针名p注意问题内存泄露举例申请和释放动态数组动态创建多维数组何为静态内存分配?通常定义变量(或对象),编译器在编译时可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候事先为他们分配确定的存储空间。这种…

    2022年8月18日
    5
  • pycharm安装插件报错怎么办_pycharm安装哪些插件

    pycharm安装插件报错怎么办_pycharm安装哪些插件Pycharm安装插件Pycharm安装插件Pycharm中一些值得安装的插件RainbowBracketsIdeaVimMarkdownNavigatorTranslation如果说编辑器是程序员的武器,那么插件就是装备加成。插件可以让编写代码更加灵活Pycharm安装插件点击file–settings,进入设置找到apperance中的Plugins,在搜索框中搜索想要的插件,然后点击安装即可Pycharm中一些值得安装的插件RainbowBrack

    2022年8月26日
    0
  • redux-saga入门[通俗易懂]

    redux-saga入门[通俗易懂]redux-saga的介绍、API、使用案例

    2022年9月19日
    0
  • 很详细的解决Tomcat乱码问题

    很详细的解决Tomcat乱码问题解决Tomcat乱码问题一、问题提出二、乱码原因三级目录一、问题提出相信很多初始Tomcat的小伙伴都会遇到下面的情况,启动Tomcat是一大堆看不懂的文字,比如。。。相信很多有强迫症的同学,看到这些很不爽,我也是,接下来我就来说一下解决方案。二、乱码原因三级目录……

    2022年7月18日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号