gpt4 book ai didi

c - 使用 SDL : Line wraps too late when resolution is not multiple of 4 播放 YUV 视频

转载 作者:太空宇宙 更新时间:2023-11-04 03:57:10 25 4
gpt4 key购买 nike

在使用 SDL_Overlay (SDL 1.2.5) 播放某些未压缩的 YUV 4:2:0 平面视频数据源时,我一直遇到一个问题。

我可以毫无问题地播放 640x480 视频。但是我刚刚尝试播放分辨率为 854x480 的视频,但我得到了一个奇怪的效果。该线太晚缠绕了 1-2 个像素(导致类似剪切的变换)并且色度消失,在每条线上被交替的 R、G 或 B 代替。参见 this screenshot

YUV 数据本身是正确的,因为我可以将它保存到一个文件中并在另一个播放器中播放。此时未填充 - 间距与行长度匹配。

我怀疑当分辨率不是 4 的倍数时会出现一些问题。也许 SDL_Surface 期望 SDL_Overlay 的色度分辨率是 2 的倍数?

更让我怀疑的是,我注意到我创建的尺寸为 854*480 的 RGB SDL_Surface 间距为 2564 ,而不是我期望的 3*854 = 2562

如果我将 1 或 2 个像素添加到 SDL_Surface 的宽度(但保持叠加层和矩形相同),它工作正常,尽管右侧有黑色边框。当然,对于 为四的倍数的视频来说,这就不成立了。

设置

screen = SDL_SetVideoMode(width, height, 24, SDL_SWSURFACE|SDL_ANYFORMAT|SDL_ASYNCBLIT);
if ( screen == NULL ) {
return 0;
}
YUVOverlay = SDL_CreateYUVOverlay(width, height, SDL_IYUV_OVERLAY, screen);
Ydata = new unsigned char[luma_size];
Udata = new unsigned char[chroma_size];
Vdata = new unsigned char[chroma_size];

YUVOverlay->pixels[0] = Ydata;
YUVOverlay->pixels[1] = Udata;
YUVOverlay->pixels[2] = Vdata;

SDL_DisplayYUVOverlay(YUVOverlay, dest);

渲染循环:

SDL_LockYUVOverlay(YUVOverlay);
memcpy(Ydata, buffer, luma_size);
memcpy(Udata, buffer+luma_size, chroma_size);
memcpy(Vdata, buffer+luma_size+chroma_size, chroma_size);
int i = SDL_DisplayYUVOverlay(YUVOverlay, dest);
SDL_UnlockYUVOverlay(YUVOverlay);

对我来说,最简单的修复方法是增加 RGB SDL_Surface 大小,使其在每个维度上都是 4 的倍数。但是这会添加一个黑色边框。

是否有解决此问题的正确方法?我应该尝试在我的 YUV 数据上使用填充吗?

最佳答案

输入数据的每个平面必须从可被 8 整除的地址开始,并且每行的步幅必须能被 8 整除。需要明确的是:您的色度平面也需要遵守这一点。

这个要求似乎来自 SDL 库在 x86 cpu 上使用 MMX 多媒体指令。请参阅分发中 src/video/SDL_yuv_mmx.c 中的注释。

更新:我查看了实际的汇编代码,源代码注释中没有提到的额外假设。这是针对 SDL 1.2.14 的。除了上述的模 8 假设之外,代码还假设输入亮度和输入色度平面都完美打包(即宽度 == 步幅)。

关于c - 使用 SDL : Line wraps too late when resolution is not multiple of 4 播放 YUV 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15358076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com