日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

YUV420有打包格式(Packed),一如前文所述。同時還有平面格式(Planar),即Y、U、V是分開存儲的,每個分量占一塊地方,其中Y為width*height,而U、V合占Y的一半,該種格式每個像素占12比特。根據U、V的順序,分出2種格式,U前V后即YUV420P,也叫I420,V前U后,叫YV12(YV表示Y后面跟著V,12表示12bit)。另外,還有一種半平面格式(Semi-planar),即Y單獨占一塊地方,但其后U、V又緊挨著排在一起,根據U、V的順序,又有2種,U前V后叫NV12,在國內好像很多人叫它為YUV420SP格式;V前U后叫NV21。這種格式似乎比NV16稍受歡迎。

首先給出轉換查詢表的生成函數,代碼是在網上找來的,如下:

static long int crv_tab[256]; static long int cbu_tab[256]; static long int cgu_tab[256]; static long int cgv_tab[256]; static long int tab_76309[256]; static unsigned char clp[1024]; //for clip in CCIR601 void init_yuv420p_table() { long int crv,cbu,cgu,cgv; int i,ind; static int init = 0;if (init == 1) return;crv = 104597; cbu = 132201; /* fra matrise i global.h */ cgu = 25675; cgv = 53279; for (i = 0; i < 256; i++) { crv_tab[i] = (i-128) * crv; cbu_tab[i] = (i-128) * cbu; cgu_tab[i] = (i-128) * cgu; cgv_tab[i] = (i-128) * cgv; tab_76309[i] = 76309*(i-16); } for (i = 0; i < 384; i++) clp[i] = 0; ind = 384; for (i = 0;i < 256; i++) clp[ind++] = i; ind = 640; for (i = 0;i < 384; i++) clp[ind++] = 255;init = 1; }

下面給出YUV420平面格式的轉換函數,如下:

/** 內存分布w+--------------------+|Y0Y1Y2Y3... ||... | h|... || |+--------------------+|U0U1 ||... | h/2|... || |+----------+|V0V1 ||... | h/2|... || |+----------+w/2*/ void yuv420p_to_rgb24(YUV_TYPE type, unsigned char* yuvbuffer,unsigned char* rgbbuffer, int width,int height) {int y1, y2, u, v; unsigned char *py1, *py2; int i, j, c1, c2, c3, c4; unsigned char *d1, *d2; unsigned char *src_u, *src_v;static int init_yuv420p = 0;src_u = yuvbuffer + width * height; // usrc_v = src_u + width * height / 4; // vif (type == FMT_YV12){src_v = yuvbuffer + width * height; // vsrc_u = src_u + width * height / 4; // u}py1 = yuvbuffer; // ypy2 = py1 + width; d1 = rgbbuffer; d2 = d1 + 3 * width; init_yuv420p_table();for (j = 0; j < height; j += 2) { for (i = 0; i < width; i += 2) {u = *src_u++; v = *src_v++; c1 = crv_tab[v]; c2 = cgu_tab[u]; c3 = cgv_tab[v]; c4 = cbu_tab[u]; //up-left y1 = tab_76309[*py1++]; *d1++ = clp[384+((y1 + c1)>>16)]; *d1++ = clp[384+((y1 - c2 - c3)>>16)]; *d1++ = clp[384+((y1 + c4)>>16)]; //down-left y2 = tab_76309[*py2++]; *d2++ = clp[384+((y2 + c1)>>16)]; *d2++ = clp[384+((y2 - c2 - c3)>>16)]; *d2++ = clp[384+((y2 + c4)>>16)]; //up-right y1 = tab_76309[*py1++]; *d1++ = clp[384+((y1 + c1)>>16)]; *d1++ = clp[384+((y1 - c2 - c3)>>16)]; *d1++ = clp[384+((y1 + c4)>>16)]; //down-right y2 = tab_76309[*py2++]; *d2++ = clp[384+((y2 + c1)>>16)]; *d2++ = clp[384+((y2 - c2 - c3)>>16)]; *d2++ = clp[384+((y2 + c4)>>16)]; }d1 += 3*width;d2 += 3*width;py1 += width;py2 += width;} }

再給出YUV420SP轉換的函數,如下:

void yuv420sp_to_rgb24(YUV_TYPE type, unsigned char* yuvbuffer,unsigned char* rgbbuffer, int width,int height) {int y1, y2, u, v; unsigned char *py1, *py2; int i, j, c1, c2, c3, c4; unsigned char *d1, *d2; unsigned char *src_u;static int init_yuv420p = 0;src_u = yuvbuffer + width * height; // upy1 = yuvbuffer; // ypy2 = py1 + width; d1 = rgbbuffer; d2 = d1 + 3 * width; init_yuv420p_table();for (j = 0; j < height; j += 2) { for (i = 0; i < width; i += 2) {if (type == FMT_NV12){u = *src_u++; v = *src_u++; // v緊跟u,在u的下一個位置}if (type == FMT_NV21){v = *src_u++; u = *src_u++; // u緊跟v,在v的下一個位置}c1 = crv_tab[v]; c2 = cgu_tab[u]; c3 = cgv_tab[v]; c4 = cbu_tab[u]; //up-left y1 = tab_76309[*py1++]; *d1++ = clp[384+((y1 + c1)>>16)]; *d1++ = clp[384+((y1 - c2 - c3)>>16)]; *d1++ = clp[384+((y1 + c4)>>16)]; //down-left y2 = tab_76309[*py2++]; *d2++ = clp[384+((y2 + c1)>>16)]; *d2++ = clp[384+((y2 - c2 - c3)>>16)]; *d2++ = clp[384+((y2 + c4)>>16)]; //up-right y1 = tab_76309[*py1++]; *d1++ = clp[384+((y1 + c1)>>16)]; *d1++ = clp[384+((y1 - c2 - c3)>>16)]; *d1++ = clp[384+((y1 + c4)>>16)]; //down-right y2 = tab_76309[*py2++]; *d2++ = clp[384+((y2 + c1)>>16)]; *d2++ = clp[384+((y2 - c2 - c3)>>16)]; *d2++ = clp[384+((y2 + c4)>>16)]; }d1 += 3*width;d2 += 3*width;py1 += width;py2 += width;} }


void yuv420sp_to_rgb24(YUV_TYPE type, unsigned char* yuvbuffer,unsigned char* rgbbuffer, int width,int height) {int y1, y2, u, v; unsigned char *py1, *py2; int i, j, c1, c2, c3, c4; unsigned char *d1, *d2; unsigned char *src_u;static int init_yuv420p = 0;src_u = yuvbuffer + width * height; // upy1 = yuvbuffer; // ypy2 = py1 + width; d1 = rgbbuffer; d2 = d1 + 3 * width; init_yuv420p_table();for (j = 0; j < height; j += 2) { for (i = 0; i < width; i += 2) {if (type == FMT_NV12){u = *src_u++; v = *src_u++; // v緊跟u,在u的下一個位置}if (type == FMT_NV21){v = *src_u++; u = *src_u++; // u緊跟v,在v的下一個位置}c1 = crv_tab[v]; c2 = cgu_tab[u]; c3 = cgv_tab[v]; c4 = cbu_tab[u]; //up-left y1 = tab_76309[*py1++]; *d1++ = clp[384+((y1 + c1)>>16)]; *d1++ = clp[384+((y1 - c2 - c3)>>16)]; *d1++ = clp[384+((y1 + c4)>>16)]; //down-left y2 = tab_76309[*py2++]; *d2++ = clp[384+((y2 + c1)>>16)]; *d2++ = clp[384+((y2 - c2 - c3)>>16)]; *d2++ = clp[384+((y2 + c4)>>16)]; //up-right y1 = tab_76309[*py1++]; *d1++ = clp[384+((y1 + c1)>>16)]; *d1++ = clp[384+((y1 - c2 - c3)>>16)]; *d1++ = clp[384+((y1 + c4)>>16)]; //down-right y2 = tab_76309[*py2++]; *d2++ = clp[384+((y2 + c1)>>16)]; *d2++ = clp[384+((y2 - c2 - c3)>>16)]; *d2++ = clp[384+((y2 + c4)>>16)]; }d1 += 3*width;d2 += 3*width;py1 += width;py2 += width;} }

總結

以上是生活随笔為你收集整理的YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品三级av | www.激情| 爱爱免费网址 | 99在线精品视频 | 亚洲一区日韩精品 | 日韩视频欧美视频 | 日产欧产va高清 | 免费美女视频网站 | 亚洲精品视频三区 | 精品欧美一区二区三区成人 | 久久这里只精品 | 亚洲精品久久久久avwww潮水 | 免费在线播放黄色片 | 黄视频在线免费 | 日产精品久久久久久久 | 亚洲欧美日韩国产精品 | 尤物一区 | 波多野吉衣在线观看视频 | 日日干日日摸 | 亚洲精品天堂在线观看 | 人妻洗澡被强公日日澡电影 | 午夜成人免费电影 | 欧洲成人午夜精品无码区久久 | 久久丫精品久久丫 | 实拍澡堂美女洗澡av | 九九视频在线观看 | av不卡免费在线 | 大肉大捧一进一出好爽视频 | 国产高清视频在线免费观看 | 女同毛片一区二区三区 | 日日干日日摸 | 五月天丁香婷 | 久久国产视频网站 | 日韩欧美一区视频 | 第一区免费在线观看 | 日本va欧美va国产激情 | 亚洲国产一区二区三区在线观看 | 二区三区在线观看 | 都市激情校园春色亚洲 | 水蜜桃亚洲精品 | 国产精品久久久一区二区三区 | 色网视频| 亚洲涩涩图 | 天天夜夜爽| 91久久综合亚洲鲁鲁五月天 | 天天想你在线观看完整版电影高清 | 免费婷婷 | 男生草女生视频 | 97超碰国产在线 | 男女日屁视频 | 亚洲av永久无码精品一区二区国产 | 青春草视频在线免费观看 | 国产精品天天看 | 一本色道久久综合无码人妻 | 国产玖玖| 好屌妞视频这里只有精品 | 日韩天堂在线 | 麻豆视频在线观看免费网站 | 久久99精品久久久久久 | 美女av在线免费观看 | 日本黄色的视频 | 丰满熟女人妻一区二区三 | 一区二区免费在线观看 | 中文在线天堂网 | 福利免费在线观看 | 四虎影院国产精品 | 久久亚洲网站 | 亚洲福利视频一区二区三区 | 凹凸精品一区二区三区 | 伊人av影院 | 欧美做爰啪啪xxxⅹ性 | av大帝在线| 日本一区二区视频免费 | 色婷婷六月 | 巨大乳の揉んで乳榨り奶水 | 中国一级免费毛片 | 中文字幕久久久 | 激情免费网站 | 日本成人激情视频 | 久操影视| 亚洲在线播放 | 色超碰 | 午夜aa| 国产日韩视频在线 | 99精品无码一区二区 | 久久久久人妻精品色欧美 | 青青草十七色 | 午夜激情黄色 | 老司机午夜免费精品视频 | 美女三级黄色片 | 亚洲激情欧美色图 | 天天干天天看 | 成人深夜福利 | 亚洲欧美成人 | 伊人久久中文 | 久久久久久久一区二区 | 国产网站无遮挡 | 蜜桃色av | 欧美精品一区二区不卡 |