Объяснение формата AVSubtitleRect DVBSub - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь преобразовать данные DVBSub в AVSubtitle в формат 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 в файл , но я не уверен Я правильно понимаю.

Я уверен, что я получаю правильные данные и текстовые субтитры выглядят хорошо. Не совсем уверен, что я делаю не так здесь.

1 Ответ

0 голосов
/ 06 марта 2020

Прямоугольники DVBSub используют индексированное цветное растровое изображение. Используется 2, 16 или 256 цветов на пиксель. Сказав, что почти всегда эти прямоугольники используют 16 (4-битный) индексированный цветовой формат. И все же один пиксель занимает целые 8-битные (4-битные + 4-битные нули).
CLUT (таблица соответствия цветов) использует полный 32-битный формат ARGB (да, с альфа-каналом для прозрачности). Таким образом, для формата 16 цветов размер CLUT составляет 64 байта (16 * 4).

Надеюсь, это поможет.

...