29 #define PUTBITS2(val)\ 31 bitbuf |= (val) << bitcnt;\ 41 const uint8_t *bitmap,
int linesize,
51 for(y = 0; y <
h; y++) {
53 if (buf_size * 8 < w * 3 + 32)
64 while (x1 < w && bitmap[x1] == color)
67 if (color == 0 && len == 2) {
71 }
else if (len >= 3 && len <= 10) {
77 }
else if (len >= 12 && len <= 27) {
85 }
else if (len >= 29) {
116 buf_size -= q - line_begin;
123 #define PUTBITS4(val)\ 125 bitbuf |= (val) << bitcnt;\ 136 const uint8_t *bitmap,
int linesize,
146 for(y = 0; y <
h; y++) {
148 if (buf_size * 8 < w * 6 + 32)
158 color = bitmap[x1++];
159 while (x1 < w && bitmap[x1] == color)
162 if (color == 0 && len == 2) {
165 }
else if (color == 0 && (len >= 3 && len <= 9)) {
168 }
else if (len >= 4 && len <= 7) {
172 }
else if (len >= 9 && len <= 24) {
177 }
else if (len >= 25) {
203 buf_size -= q - line_begin;
211 const uint8_t *bitmap,
int linesize,
219 for (y = 0; y <
h; y++) {
221 if (buf_size * 8 < w * 12 + 24)
229 color = bitmap[x1++];
230 while (x1 < w && bitmap[x1] == color)
233 if (len == 1 && color) {
239 len =
FFMIN(len, 127);
242 }
else if (len > 2) {
244 len =
FFMIN(len, 127);
264 buf_size -= q - line_begin;
277 int page_id, region_id, clut_id, object_id,
i, bpp_index, page_state;
293 bytestream_put_be16(&q, page_id);
297 bytestream_put_be16(&q, avctx->
width - 1);
298 bytestream_put_be16(&q, avctx->
height - 1);
299 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
305 if (buf_size < 8 + h->num_rects * 6)
309 bytestream_put_be16(&q, page_id);
317 for (region_id = 0; region_id < h->
num_rects; region_id++) {
320 bytestream_put_be16(&q, h->
rects[region_id]->
x);
321 bytestream_put_be16(&q, h->
rects[region_id]->
y);
324 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
328 for (clut_id = 0; clut_id < h->
num_rects; clut_id++) {
329 if (buf_size < 6 + h->rects[clut_id]->nb_colors * 6)
351 bytestream_put_be16(&q, page_id);
355 *q++ = (0 << 4) | 0
xf;
359 *q++ = (1 << (7 - bpp_index)) | (0xf << 1) | 1;
362 uint32_t x= ((uint32_t*)h->
rects[clut_id]->
data[1])[
i];
363 a = (x >> 24) & 0xff;
364 r = (x >> 16) & 0xff;
375 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
380 if (buf_size < h->num_rects * 22)
382 for (region_id = 0; region_id < h->
num_rects; region_id++) {
401 bytestream_put_be16(&q, page_id);
406 bytestream_put_be16(&q, h->
rects[region_id]->
w);
407 bytestream_put_be16(&q, h->
rects[region_id]->
h);
408 *q++ = ((1 + bpp_index) << 5) | ((1 + bpp_index) << 2) | 0x03;
413 bytestream_put_be16(&q, region_id);
414 *q++ = (0 << 6) | (0 << 4);
419 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
425 for (object_id = 0; object_id < h->
num_rects; object_id++) {
426 int (*dvb_encode_rle)(
uint8_t **pq,
int buf_size,
427 const uint8_t *bitmap,
int linesize,
450 bytestream_put_be16(&q, page_id);
454 bytestream_put_be16(&q, object_id);
459 uint8_t *ptop_field_len, *pbottom_field_len, *top_ptr, *bottom_ptr;
464 pbottom_field_len = q;
469 ret = dvb_encode_rle(&q, buf_size,
471 h->
rects[object_id]->
w * 2,
473 h->
rects[object_id]->
h >> 1);
478 ret = dvb_encode_rle(&q, buf_size,
480 h->
rects[object_id]->
w * 2,
482 h->
rects[object_id]->
h >> 1);
487 bytestream_put_be16(&ptop_field_len, bottom_ptr - top_ptr);
488 bytestream_put_be16(&pbottom_field_len, q - bottom_ptr);
491 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
501 bytestream_put_be16(&q, page_id);
505 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
513 unsigned char *buf,
int buf_size,
int x
top left corner of pict, undefined when pict is not set
int nb_colors
number of colors in pict, undefined when pict is not set
static int dvb_encode_rle8(uint8_t **pq, int buf_size, const uint8_t *bitmap, int linesize, int w, int h)
AVCodec ff_dvbsub_encoder
int w
width of pict, undefined when pict is not set
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
static int encode_dvb_subtitles(AVCodecContext *avctx, uint8_t *outbuf, int buf_size, const AVSubtitle *h)
int h
height of pict, undefined when pict is not set
#define i(width, name, range_min, range_max)
Various defines for YUV<->RGB conversion.
int y
top left corner of pict, undefined when pict is not set
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define RGB_TO_U_CCIR(r1, g1, b1, shift)
const char * name
Name of the codec implementation.
static int dvb_encode_rle2(uint8_t **pq, int buf_size, const uint8_t *bitmap, int linesize, int w, int h)
#define AVERROR_BUFFER_TOO_SMALL
Buffer too small.
int width
picture width / height.
static int dvbsub_encode(AVCodecContext *avctx, unsigned char *buf, int buf_size, const AVSubtitle *sub)
uint8_t * data[4]
data+linesize for the bitmap of this subtitle.
Libavcodec external API header.
main external API structure.
#define xf(width, name, var, range_min, range_max, subs,...)
#define RGB_TO_V_CCIR(r1, g1, b1, shift)
#define RGB_TO_Y_CCIR(r, g, b)
static int dvb_encode_rle4(uint8_t **pq, int buf_size, const uint8_t *bitmap, int linesize, int w, int h)