我正在尝试将AVSubtitle中的DVBSub数据转换为RGB格式,但似乎不起作用。我只是随便弄点颜色。
这是代码:
/* rects comes from AVSubtitleRect type elsewhere*/
int bw = rects[0].w;
int bh = rects[0].h;
uint32_t colour;
uint32_t *bitmap;
int r, g, b;
/* Give it some memory */
bitmap = malloc(bw * bh * sizeof(uint32_t));
for (int y = 0; y < bh; y++)
{
for (int x = 0; x < bw; x++)
{
/* data[0] holds index data */
const uint8_t index = rects[0]->data[0][y * bw + x];
/* data[1] holds colours - get colour from index */
colour = rects[0]->data[1][4 * index];
r = (colour >> 16) & 0xFF;
g = (colour >> 8) & 0xFF;
b = (colour >> 0) & 0xFF;
/* construct bitmap pixel by pixel (24 bit RGB) */
bitmap[y * bw + x] = r << 16 | g << 8 | b;
}
}
这里有一些信息从文件中的AVSubtitle转储字幕,但我不确定我是否正确理解。
我确信我得到的数据是正确的,基于文本的字幕看起来很好。不太确定我在这里做错了什么。
DVBSub矩形使用索引彩色位图。每使用一个像素2、16或256种颜色。话虽如此,这些矩形几乎总是使用16(4位(索引的颜色格式。然而,单个像素占用整个8位(4位+4位零(
CLUT(颜色查找表(使用完整的32位ARGB格式(是的,Alpha通道用于透明度(。因此,对于16色格式,CLUT大小为64字节(16*4(。
希望这些能有所帮助。