DM365 color space
YUV的幾種格式
420P:420P數(shù)據(jù)的存放方式一般是先存放Y,然后存放U,最后存放V的數(shù)據(jù),每一個像素使用12bits(1.5BYTE)保存。
422P:422P數(shù)據(jù)的存放方式也是先存放Y,然后存放U,最后存放V的數(shù)據(jù),每一個像素使用16bits(2BYTE)保存。
420PSemi,422PSemi:這是TI新添加的一種格式,在DM6467的輸出當(dāng)中使用的是422PSemi來進(jìn)行輸出,所以將YUV的數(shù)據(jù)輸出之前都需要將其他格式的YUV數(shù)據(jù)轉(zhuǎn)換為422PSemi格式。
這兩種格式所占用的存儲空間分別和420P, 422P所占的存儲空間一致。
420PSemi:先存放Y的數(shù)據(jù),接著U和V的數(shù)據(jù)交叉存放,對于422PSemi也是一樣。
舉個例子:
對于30*20像素的420P的YUV數(shù)據(jù),在存儲的時候會先存30*20字節(jié)的Y,然后存放15*10字節(jié)的U,最后存放15*10的V。
如果是420PSemi,那么會先存放30*20字節(jié)的Y,接著U和V會交叉存放,分別存放15*10字節(jié),這樣420P和420PSemi所占空間均為30*20*3/2字節(jié)。
YUV格式簡介
YUV主要用于優(yōu)化彩色視頻信號的傳輸,使其向后相容老式黑白電視。與RGB視頻信號傳輸相比,它最大的優(yōu)點(diǎn)在于只需占用極少的頻寬(RGB要求三個獨(dú)立的視頻信號同時傳輸)。其中 “Y”表示明亮度(Luminance或Luma),也就是灰階值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色?!傲炼取笔峭高^RGB輸入信號來建立的,方 法是將RGB信號的特定部分疊加到一起。“色度”則定義了顏色的兩個方面─色調(diào)與飽和度,分別用Cr和CB來表示。其中,Cr反映了RGB輸入信號紅色部 分與RGB信號亮度值之間的差異。而Cb反映的是RGB輸入信號藍(lán)色部分與RGB信號亮度值之同的差異。
采用YUV色彩空間的重要性是它的亮度信號Y和色度信號U、V是分離的。如果只有Y信號分量而 沒有U、V分量,那么這樣表示的圖像就是黑白灰度圖像。彩色電視采用YUV空間正是為了用亮度信號Y解決彩色電視機(jī)與黑白電視機(jī)的兼容問題,使黑白電視機(jī) 也能接收彩色電視信號。
在TI的DMAI框架中,對于OMAP3530,視頻輸出的時候使用的是V4L2_PIX_FMT_YUYV (’YUYV’), 而DM6467采用的是V4L2_PIX_FMT_YUV422UVP。
下面的話是從DMAI的ColorSpace.h中摘出來的:
而我們在使用YUVPlayer的時候,只有420P, 422P等能夠播放,而420PSemi和422PSemi不能播放,所以在存儲和讀取的時候需要轉(zhuǎn)換,下面是一個轉(zhuǎn)化函數(shù):
void yuv_420p_to_420psemi(int32_t height, int32_t width, int32_t lineLength, char *src, char *dst)
{
int32_t i, j;
int32_t size;
int32_t quarter_size;
size = height * lineLength;
quarter_size = size / 4;
for (i=0; i<height; i++)
{
for (j=0; j<width; j++)
{
memcpy(dst, src, width);
}
dst += lineLength;
src += width;
}
for (i=0; i<height/2; i++)
{
for (j=0; j<width; j += 2)
{
*(dst+j+i*lineLength) = *src++;
}
}
for (i=0; i<height/2; i++)
{
for (j=1; j<width; j += 2)
{
*(dst+j+i*lineLength) = *src++;
}
}
}總結(jié)
以上是生活随笔為你收集整理的DM365 color space的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。