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)。
希望这些对您有所帮助。
我正在尝试将 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)。
希望这些对您有所帮助。