nv121_nvl2函数用法

nv121_nvl2函数用法#include#include#include#include#includetypedefunsignedcharuint8_t; /**  *@paramsrcinputnv12rawdataarray  *@paramdstoutputnv12rawdataresult,  *thememor

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

Jetbrains全系列IDE稳定放心使用
#include <time.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <sys/stat.h>

typedef unsigned char uint8_t;

 

/** 

 * @param src input nv12 raw data array  

 * @param dst output nv12 raw data result, 

 * the memory need to be allocated outside of the function 

 * @param srcWidth width of the input nv12 image 

 * @param srcHeight height of the input nv12 image 

 * @param dstWidth

 * @param dstHeight 

 */

void nv12_nearest_scale(uint8_t* __restrict src, uint8_t* __restrict dst,

                        int srcWidth, int srcHeight, int dstWidth, int

dstHeight)      //restrict keyword is for compiler to optimize program

{

    register int sw = srcWidth;  //register keyword is for local var to accelorate 

    register int sh = srcHeight;

    register int dw = dstWidth;

    register int dh = dstHeight;

    register int y, x;

    unsigned long int srcy, srcx, src_index, dst_index;

    unsigned long int xrIntFloat_16 = (sw << 16) / dw + 1; //better than float division

    unsigned long int yrIntFloat_16 = (sh << 16) / dh + 1;

    uint8_t* dst_uv = dst + dh * dw; //memory start pointer of dest uv

    uint8_t* src_uv = src + sh * sw; //memory start pointer of source uv

    uint8_t* dst_uv_yScanline;

    uint8_t* src_uv_yScanline;

    uint8_t* dst_y_slice = dst; //memory start pointer of dest y

    uint8_t* src_y_slice;

    uint8_t* sp;

    uint8_t* dp;

 

    for (y = 0; y < (dh & ~7); ++y)  //’dh & ~7′ is to generate faster assembly code

    {

        srcy = (y * yrIntFloat_16) >> 16;

        src_y_slice = src + srcy * sw;

        if((y & 1) == 0)

        {

            dst_uv_yScanline = dst_uv + (y / 2) * dw;

            src_uv_yScanline = src_uv + (srcy / 2) * sw;

        }

        for(x = 0; x < (dw & ~7); ++x)

        {

            srcx = (x * xrIntFloat_16) >> 16;

            dst_y_slice[x] = src_y_slice[srcx];

            if((y & 1) == 0) //y is even

            {

                if((x & 1) == 0) //x is even

                {

                    src_index = (srcx / 2) * 2;

            

                    sp = dst_uv_yScanline + x;

                    dp = src_uv_yScanline + src_index;

                    *sp = *dp;

                    ++sp;

                    ++dp;

                    *sp = *dp;

                }

             }

         }

         dst_y_slice += dw;

    }

}

void nv12_bilinear_scale (uint8_t* src, uint8_t* dst,

        int srcWidth, int srcHeight, int dstWidth,int dstHeight)

{

    int x, y;

    int ox, oy;

    int tmpx, tmpy;

    int xratio = (srcWidth << 8)/dstWidth;

    int yratio = (srcHeight << 8)/dstHeight;

    uint8_t* dst_y = dst;

    uint8_t* dst_uv = dst + dstHeight * dstWidth;

    uint8_t* src_y = src;

    uint8_t* src_uv = src + srcHeight * srcWidth;

    uint8_t y_plane_color[2][2];

    uint8_t u_plane_color[2][2];

    uint8_t v_plane_color[2][2];

    int j,i;

    int size = srcWidth * srcHeight;

    int offsetY;

    int y_final, u_final, v_final; 

    int u_final1 = 0;

    int v_final1 = 0;

    int u_final2 = 0;

    int v_final2 = 0;

    int u_final3 = 0;

    int v_final3 = 0;

    int u_final4 = 0;

    int v_final4 = 0;

    int u_sum = 0;

    int v_sum = 0;

    tmpy = 0;

    for (j = 0; j < (dstHeight & ~7); ++j)

    {

        //tmpy = j * yratio;

    oy = tmpy >> 8;

    y = tmpy & 0xFF;

    tmpx = 0;

    for (i = 0; i < (dstWidth & ~7); ++i)

    {

        // tmpx = i * xratio;

        ox = tmpx >> 8;

        x = tmpx & 0xFF;

    

        offsetY = oy * srcWidth;

            //YYYYYYYYYYYYYYYY

        y_plane_color[0][0] = src[ offsetY + ox ];

        y_plane_color[1][0] = src[ offsetY + ox + 1 ];

        y_plane_color[0][1] = src[ offsetY + srcWidth + ox ];

        y_plane_color[1][1] = src[ offsetY + srcWidth + ox + 1 ];

            

        int y_final = (0x100 – x) * (0x100 – y) * y_plane_color[0][0]

            + x * (0x100 – y) * y_plane_color[1][0]

            + (0x100 – x) * y * y_plane_color[0][1]

            + x * y * y_plane_color[1][1];

        y_final = y_final >> 16;

        if (y_final>255)

            y_final = 255;

        if (y_final<0)

            y_final = 0;

        dst_y[ j * dstWidth + i] = (uint8_t)y_final; //set Y in dest array 

            //UVUVUVUVUVUV

        if((j & 1) == 0) //j is even

        {

            if((i & 1) == 0) //i is even

            {

                u_plane_color[0][0] = src[ size + offsetY + ox ];

                u_plane_color[1][0] = src[ size + offsetY + ox ];

                u_plane_color[0][1] = src[ size + offsetY + ox ];

                u_plane_color[1][1] = src[ size + offsetY + ox ];

                v_plane_color[0][0] = src[ size + offsetY + ox + 1];

                v_plane_color[1][0] = src[ size + offsetY + ox + 1];

                v_plane_color[0][1] = src[ size + offsetY + ox + 1];

                v_plane_color[1][1] = src[ size + offsetY + ox + 1];

            }

            else //i is odd

            {

                u_plane_color[0][0] = src[ size + offsetY + ox – 1 ];

                u_plane_color[1][0] = src[ size + offsetY + ox + 1 ];

                u_plane_color[0][1] = src[ size + offsetY + ox – 1 ];

                u_plane_color[1][1] = src[ size + offsetY + ox + 1 ];

                v_plane_color[0][0] = src[ size + offsetY + ox ];

                v_plane_color[1][0] = src[ size + offsetY + ox + 1 ];

                v_plane_color[0][1] = src[ size + offsetY + ox ];

                v_plane_color[1][1] = src[ size + offsetY + ox + 1 ];

            }

        }

        else // j is odd

        {

            if((i & 1) == 0) //i is even

            {

                u_plane_color[0][0] = src[ size + offsetY + ox ];

                u_plane_color[1][0] = src[ size + offsetY + ox ];

                u_plane_color[0][1] = src[ size + offsetY + srcWidth + ox ];

                u_plane_color[1][1] = src[ size + offsetY + srcWidth + ox ];

                    

                v_plane_color[0][0] = src[ size + offsetY + ox + 1];

                v_plane_color[1][0] = src[ size + offsetY + ox + 1];

                v_plane_color[0][1] = src[ size + offsetY + srcWidth + ox + 1];

                v_plane_color[1][1] = src[ size + offsetY + srcWidth + ox + 1];                                                    

            }

            else //i is odd

            {

                u_plane_color[0][0] = src[ size + offsetY + ox – 1 ];

                u_plane_color[1][0] = src[ size + offsetY + srcWidth + ox – 1 ];

                u_plane_color[0][1] = src[ size + offsetY + ox + 1];

                u_plane_color[1][1] = src[ size + offsetY + srcWidth + ox + 1];

                v_plane_color[0][0] = src[ size + offsetY + ox ];

                v_plane_color[1][0] = src[ size + offsetY + srcWidth + ox ];

                v_plane_color[0][1] = src[ size + offsetY + ox + 2 ];

                v_plane_color[1][1] = src[ size + offsetY + srcWidth + ox + 2 ];

            }

        }

       int u_final = (0x100 – x) * (0x100 – y) * u_plane_color[0][0]

                     + x * (0x100 – y) * u_plane_color[1][0]

                     + (0x100 – x) * y * u_plane_color[0][1]

                     + x * y * u_plane_color[1][1];

       u_final = u_final >> 16;

       int v_final = (0x100 – x) * (0x100 – y) * v_plane_color[0][0]

                      + x * (0x100 – y) * v_plane_color[1][0]

                      + (0x100 – x) * y * v_plane_color[0][1]

                      + x * y * v_plane_color[1][1];

       v_final = v_final >> 16;

       if((j & 1) == 0)

       {

           if((i & 1) == 0)

           {    

               //set U in dest array  

               dst_uv[(j / 2) * dstWidth + i ] = (uint8_t)(u_sum / 4);

               //set V in dest array

               dst_uv[(j / 2) * dstWidth + i + 1] = (uint8_t)(v_sum / 4);

               u_sum = 0;

               v_sum = 0;

           }

       }

       else

       {

           u_sum += u_final;

           v_sum += v_final;

       }

       tmpx += xratio;

    }

    tmpy += yratio;

    }

}

int ImageResize(uint8_t * src, uint8_t* dst, int sw,

        int sh,int dw,int dh)

{

    if( (src == NULL) || (dst == NULL) || (0 == dw) || (0 == dh) ||

            (0 == sw) || (0 == sh))

    {

        printf(“params error\n”);

        return -1;

    }

        nv12_nearest_scale(src, dst, sw, sh, dw, dh);

    //nv12_bilinear_scale(src, dst, sw, sh, dw, dh);

    //greyscale(src, dst, sw, sh, dw, dh);

    return 0;

}

int main(int argc,char**argv)

{

    if(argc!=7)

    {

        printf(“Input Error!\n”);

        printf(“Usage :  <Input NV12file> <Output NV12file> 

                <sw><sh> <dw> <dh>”);

        return 0;

    }

 

    FILE *inputfp = NULL;

    FILE *outputfp = NULL;

 

    inputfp = fopen(argv[1], “rb”);

    if (!inputfp)

    {

        fprintf(stderr, “fopen failed for input file[%s]\n”,argv[1]);

        return -1;

    }

 

    outputfp = fopen(argv[2], “wb”);

 

    if (!outputfp)

    {

        fprintf(stderr, “fopen failed for output file[%s]\n”,argv[2]);

        return -1;

    }

 

    int sw = atoi(argv[3]);

    int sh = atoi(argv[4]);

    int dw = atoi(argv[5]);

    int dh = atoi(argv[6]);

 

    if(sw <= 0 || sh <= 0 || dw <= 0 || dh <=0)

    {

        fprintf(stderr, “parameter error [sw= %d,sh= %d,dw= %d,dh= %d]\n”,sw,sh,dw,dh);

        return -1;

    }

 

    int inPixels = sw * sh * 3/2;

    int outPixels = dw * dh * 3/2;

 

    uint8_t* pInBuffer = (uint8_t*)malloc(inPixels);

    fread(pInBuffer,1,inPixels,inputfp);

    uint8_t* pOutBuffer = (uint8_t*)malloc(outPixels);

 

    ImageResize(pInBuffer,pOutBuffer,sw,sh,dw,dh);

        //compute frame per second

    int i = 0;

    clock_t start = clock();

 

    for(;i<1000;++i)

    {

        ImageResize(pInBuffer,pOutBuffer,1536,1088,1024,600);//can change to be any resolution    

    }

    clock_t finish = clock();

    float duration = (float)(finish-start)/CLOCKS_PER_SEC;

    float fps = 1000 / duration;

    printf(“nv12Scaling:%d*%d–>%d*%d,time cost:%6.2ffps\n”,sw,sh,dw,dh,fps);

 

    fwrite(pOutBuffer, 1 , outPixels, outputfp);

 

    free(pInBuffer);

    free(pOutBuffer);

    fclose(inputfp);

    fclose(outputfp);

    pInBuffer = NULL;

    pOutBuffer = NULL;

    inputfp = NULL;

    outputfp = NULL;

    return 0;

}

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189959.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 动态代理

    动态代理

  • Android studio安装教程(2020/11/20最新版本的安装)[通俗易懂]

    Android studio安装教程(2020/11/20最新版本的安装)[通俗易懂]最新版Androidstudio的安装教程,安装步骤详细!对于gradle下不下来以及想整一个低版本的SDK的问题进行了解答!

  • 黑苹果安装详细过程

    黑苹果安装详细过程前言:此教程谨献给出入黑苹果的小白们学习经验,如安装过程出现任何意外将于本人无关。鉴于网上有很多大佬写的教程,但以我的角度来看(才识浅薄),有些细节并没有提到,会让小白比较懵,所以才有了写这篇教程的想法。第一次写教程,请多指教,有写错的地方还请各路大神指正,老鸟看看就好,勿喷(感谢)(未经允许,禁止转载,请尊重)废话就不说了,直接进入正题。UEFI+GPT是前提,如果是传统引导方式的,请自行…

  • web页面请求的整个过程_HTTP的请求方法

    web页面请求的整个过程_HTTP的请求方法HTTP请求的完全过程1.1浏览器根据域名解析IP地址浏览器根据访问的域名找到其IP地址。DNS查找过程如下:浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。 系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会…

  • 这个问题让我疯掉!用oledbcommand执行一个插入一条记录的程序,到现在也没有解决!…

    这个问题让我疯掉!用oledbcommand执行一个插入一条记录的程序,到现在也没有解决!…数据库结构:StringStr=”INSERTINTODataHis(时间,开盘价,最高价,最低价,收盘价)VALUES(’98-02-12′,4,34,45,56)”;//StringStr=”select*fromDataHis”;stringstrConn=”Provider=Mic…

  • js的6种数据类型_主要的数据类型

    js的6种数据类型_主要的数据类型JS常用的六种数据类型在JS中一共有九种数据类型,有六种基本数据类型,分别是:String(字符串)、Number(数值)、Boolean(布尔值)、Null(空值)、Undefined(未定义)、Object(对象)String字符串在JS中字符串需要使用引号引起来使用双引号或单引号都行,但是不要混着用引号不能嵌套,双引号不能放双引号,单引号不能放单引号在字符串中我们可以使用\作为转义字符,当表示一些特殊符号是可以使用\进行转义\“表示”、\‘表示’、\n表示换行、\t制表符

发表回复

您的电子邮箱地址不会被公开。

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