DMA2D_Copy_YCbCr_To_RGB

//使用時注意第62行的g_LcdWidth是表示顯示屏的寬度
//以及輸出是RGB565格式還是ARGB8888格式。

/*


  • 函 數 名: DMA2D_Copy_YCbCr_To_RGB
  • 功能說明: YCbCr轉RGB輸出
  • 形 參: pSrc: 數據源地址
  • pDst: 數據目的地址
  • x: X軸首地址
  • y: Y軸首地址
  • xsize: 目的區域的X軸大小,即每行像素數
  • ysize: 目的區域的Y軸大小,即行數
  • PixelFormat: 目標區顏色格式
  • ChromaSampling : YCbCr Chroma sampling : 4:2:0, 4:2:2 or 4:4:4
  • 返 回 值: 無


    /
    static void DMA2D_Copy_YCbCr_To_RGB(uint32_t
    pSrc,
    uint32_t *pDst,
    uint16_t x,
    uint16_t y,
    uint16_t xsize,
    uint16_t ysize,
    uint32_t PixelFormat,
    uint32_t ChromaSampling)
    {
    uint32_t cssMode = DMA2D_CSS_420;
    uint32_t inputLineOffset = 0;
    uint32_t destination = 0;

    /* 處理輸入行偏移 */
    if(ChromaSampling == JPEG_420_SUBSAMPLING)
    {
            cssMode = DMA2D_CSS_420;
    
            inputLineOffset = xsize % 16;
            if(inputLineOffset != 0)
            {
                    inputLineOffset = 16 - inputLineOffset;
            }   
    }
    else if(ChromaSampling == JPEG_444_SUBSAMPLING)
    {
            cssMode = DMA2D_NO_CSS;
    
            inputLineOffset = xsize % 8;
            if(inputLineOffset != 0)
            {
                    inputLineOffset = 8 - inputLineOffset;
            }   
    }
    else if(ChromaSampling == JPEG_422_SUBSAMPLING)
    {
            cssMode = DMA2D_CSS_422;
    
            inputLineOffset = xsize % 16;
            if(inputLineOffset != 0)
            {
                    inputLineOffset = 16 - inputLineOffset;
            }      
    }  
    
    /* 輸出地址,特別注意末尾乘以2的對RGB565,如果輸出格式是ARGB8888,需要乘以4 */
    destination = (uint32_t)pDst + ((y * g_LcdWidth) + x) * 2;
    
    /* DMA2D採用存儲器到存儲器模式,並且執行FPC顏色格式轉換, 這種模式是前景層作爲DMA2D輸入 */  
    DMA2D->CR      = 0x00010000UL | (1 << 9);
    DMA2D->OOR     = g_LcdWidth - xsize;
    
    /* 輸出格式 */
    DMA2D->OPFCCR  = PixelFormat
                     | (DMA2D_REGULAR_ALPHA << 20)
                     | (DMA2D_RB_REGULAR << 21);  
    
    /* 前景層輸入格式 */        
    DMA2D->FGPFCCR = DMA2D_INPUT_YCBCR
                     | (DMA2D_REPLACE_ALPHA << 16)
                     | (DMA2D_REGULAR_ALPHA << 20)
                     | (DMA2D_RB_REGULAR << 21)   
                     | (0xFFU << 24)              
                     | (cssMode << 18);               
    
    DMA2D->FGOR    = inputLineOffset;
    DMA2D->NLR     = (uint32_t)(xsize << 16) | (uint16_t)ysize;      
    DMA2D->OMAR    = (uint32_t)destination;
    DMA2D->FGMAR   = (uint32_t)pSrc;  
    
    /* 啓動傳輸 */
    DMA2D->CR   |= DMA2D_CR_START;   
    
    /* 等待DMA2D傳輸完成 */
    while (DMA2D->CR & DMA2D_CR_START) {}

    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章