|
反客例程修改。硬解压800*600图像正常,超过800就异常。
怎么改才能在800*600屏幕上显示超过800的图片(缩小、剪裁都可以)?
//硬件解码使用这函数
void DMA2D_Copy_YCbCr_To_RGB_v(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 ss01; //转换c数
uint32_t s24x;
uint32_t cssMode = DMA2D_CSS_420;
uint32_t inputLineOffset = 0;
uint32_t destination = 0;
JPEG_ConfTypeDef JPEG_Info;
HAL_JPEG_GetInfo(&hjpeg, &JPEG_Info); // 获取JPG图片信息
x=0; y=0;
xsize=JPEG_Info.ImageWidth; //目的区域的X轴大小,即每行像素数
ysize=JPEG_Info.ImageHeight; //目的区域的Y轴大小,即行数
PixelFormat= LTDC_PIXEL_FORMAT_RGB565; //目标区颜色格式
ChromaSampling= JPEG_Info.ChromaSubsampling; //目标区颜色格式
if(ChromaSampling == JPEG_420_SUBSAMPLING)
{
cssMode = DMA2D_CSS_420;
s24x=24;
inputLineOffset = xsize % 16;
if(inputLineOffset != 0)
{
inputLineOffset = 16 - inputLineOffset;
}
}
else if(ChromaSampling == JPEG_444_SUBSAMPLING)
{
cssMode = DMA2D_NO_CSS;
s24x=48;
inputLineOffset = xsize % 8;
if(inputLineOffset != 0)
{
inputLineOffset = 8 - inputLineOffset;
}
}
else if(ChromaSampling == JPEG_422_SUBSAMPLING)
{
cssMode = DMA2D_CSS_422;
s24x=32;
inputLineOffset = xsize % 16;
if(inputLineOffset != 0)
{
inputLineOffset = 16 - inputLineOffset;
}
}
ss01=ysize/16; //下次转换增加地址
while(ss01--)
{
// 输出地址,乘以2的对RGB565,如果输出格式是ARGB8888,需要乘以4
destination = (uint32_t)pDst + ((y * g_LcdWidth) + x) * 2 + g_LcdWidth*32*ss01;
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) | 16; //每次转换16行
DMA2D->OMAR = (uint32_t)destination;
DMA2D->FGMAR = (uint32_t)pSrc+ (xsize+inputLineOffset)*s24x*ss01;
DMA2D->CR |= DMA2D_CR_START;
while (DMA2D->CR & DMA2D_CR_START) {}
}
}
|
|