30 #define PUTBITS2(val)\
32 bitbuf |= (val) << bitcnt;\
42 const uint8_t *bitmap,
int linesize,
45 uint8_t *q, *line_begin;
52 for(y = 0; y <
h; y++) {
54 if (buf_size * 8 <
w * 3 + 32)
65 while (x1 <
w && bitmap[x1] ==
color)
72 }
else if (
len >= 3 &&
len <= 10) {
78 }
else if (
len >= 12 &&
len <= 27) {
86 }
else if (
len >= 29) {
117 buf_size -= q - line_begin;
124 #define PUTBITS4(val)\
126 bitbuf |= (val) << bitcnt;\
137 const uint8_t *bitmap,
int linesize,
140 uint8_t *q, *line_begin;
147 for(y = 0; y <
h; y++) {
149 if (buf_size * 8 <
w * 6 + 32)
159 color = bitmap[x1++];
160 while (x1 <
w && bitmap[x1] ==
color)
169 }
else if (
len >= 4 &&
len <= 7) {
173 }
else if (
len >= 9 &&
len <= 24) {
178 }
else if (
len >= 25) {
204 buf_size -= q - line_begin;
212 const uint8_t *bitmap,
int linesize,
215 uint8_t *q, *line_begin;
220 for (y = 0; y <
h; y++) {
222 if (buf_size * 8 <
w * 12 + 24)
230 color = bitmap[x1++];
231 while (x1 <
w && bitmap[x1] ==
color)
243 }
else if (
len > 2) {
265 buf_size -= q - line_begin;
276 uint8_t *q, *pseg_len;
277 int page_id, region_id, clut_id, object_id,
i, bpp_index, page_state;
284 if (
h->num_rects && !
h->rects)
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);
315 *q++ = (
s->object_version << 4) | (page_state << 2) | 3;
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);
325 buf_size -= 8 +
h->num_rects * 6;
328 for (clut_id = 0; clut_id <
h->num_rects; clut_id++) {
329 if (buf_size < 6 + h->rects[clut_id]->nb_colors * 6)
334 if (
h->rects[clut_id]->nb_colors <= 4) {
337 }
else if (
h->rects[clut_id]->nb_colors <= 16) {
340 }
else if (
h->rects[clut_id]->nb_colors <= 256) {
351 bytestream_put_be16(&q, page_id);
355 *q++ = (0 << 4) | 0
xf;
357 for(
i = 0;
i <
h->rects[clut_id]->nb_colors;
i++) {
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);
376 buf_size -= 6 +
h->rects[clut_id]->nb_colors * 6;
379 if (buf_size < h->num_rects * 22)
381 for (region_id = 0; region_id <
h->num_rects; region_id++) {
385 if (
h->rects[region_id]->nb_colors <= 4) {
388 }
else if (
h->rects[region_id]->nb_colors <= 16) {
391 }
else if (
h->rects[region_id]->nb_colors <= 256) {
400 bytestream_put_be16(&q, page_id);
404 *q++ = (
s->object_version << 4) | (0 << 3) | 0x07;
405 bytestream_put_be16(&q,
h->rects[region_id]->w);
406 bytestream_put_be16(&q,
h->rects[region_id]->h);
407 *q++ = ((1 + bpp_index) << 5) | ((1 + bpp_index) << 2) | 0x03;
412 bytestream_put_be16(&q, region_id);
413 *q++ = (0 << 6) | (0 << 4);
418 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
420 buf_size -=
h->num_rects * 22;
422 for (object_id = 0; object_id <
h->num_rects; object_id++) {
423 int (*dvb_encode_rle)(uint8_t **pq,
int buf_size,
424 const uint8_t *bitmap,
int linesize,
431 if (
h->rects[object_id]->nb_colors <= 4) {
434 }
else if (
h->rects[object_id]->nb_colors <= 16) {
437 }
else if (
h->rects[object_id]->nb_colors <= 256) {
447 bytestream_put_be16(&q, page_id);
451 bytestream_put_be16(&q, object_id);
452 *q++ = (
s->object_version << 4) | (0 << 2) | (0 << 1) | 1;
456 uint8_t *ptop_field_len, *pbottom_field_len, *top_ptr, *bottom_ptr;
461 pbottom_field_len = q;
466 ret = dvb_encode_rle(&q, buf_size,
467 h->rects[object_id]->data[0],
468 h->rects[object_id]->w * 2,
469 h->rects[object_id]->w,
470 h->rects[object_id]->h >> 1);
475 ret = dvb_encode_rle(&q, buf_size,
476 h->rects[object_id]->data[0] +
h->rects[object_id]->w,
477 h->rects[object_id]->w * 2,
478 h->rects[object_id]->w,
479 h->rects[object_id]->h >> 1);
484 bytestream_put_be16(&ptop_field_len, bottom_ptr - top_ptr);
485 bytestream_put_be16(&pbottom_field_len, q - bottom_ptr);
488 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
498 bytestream_put_be16(&q, page_id);
502 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
505 s->object_version = (
s->object_version + 1) & 0
xf;