jpg转nv12

代码主要用到了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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值