AVSubtitleRect DVBSub 格式解释

AVSubtitleRect DVBSub format explanation

我正在尝试将 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;
        }
    }

这里有一些信息但我不确定我是否理解正确。

我确定我得到的数据是正确的,基于文本的字幕看起来也不错。不太确定我在这里做错了什么。

DVBSub 矩形使用索引颜色位图。每个像素使用 2、16 或 256 种颜色。 话虽如此,这些矩形几乎总是使用 16(4 位)索引颜色格式。 然而单个像素占用整个 8 位(4 位 + 4 位零)。
CLUT(颜色查找 table)使用完整的 32 位 ARGB 格式(是的,带有用于透明度的 Alpha 通道)。所以对于 16 色格式,CLUT 大小为 64 字节(16*4)。

希望这些对您有所帮助。