Go to the documentation of this file.
31 #define DVBSUB_PAGE_SEGMENT 0x10
32 #define DVBSUB_REGION_SEGMENT 0x11
33 #define DVBSUB_CLUT_SEGMENT 0x12
34 #define DVBSUB_OBJECT_SEGMENT 0x13
35 #define DVBSUB_DISPLAYDEFINITION_SEGMENT 0x14
36 #define DVBSUB_DISPLAY_SEGMENT 0x80
38 #define cm (ff_crop_tab + MAX_NEG_CROP)
40 #define RGBA(r,g,b,a) (((unsigned)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))
147 while (ptr && ptr->
id != object_id) {
158 while (ptr && ptr->
id != clut_id) {
169 while (ptr && ptr->
id != region_id) {
187 obj_disp_ptr = &
object->display_list;
188 obj_disp = *obj_disp_ptr;
190 while (obj_disp && obj_disp != display) {
192 obj_disp = *obj_disp_ptr;
199 obj2_ptr = &
ctx->object_list;
202 while (obj2 !=
object) {
204 obj2_ptr = &obj2->
next;
208 *obj2_ptr = obj2->
next;
224 while (
ctx->clut_list) {
235 while (
ctx->object_list) {
238 ctx->object_list =
object->next;
246 while (
ctx->region_list) {
249 ctx->region_list = region->
next;
260 int i,
r,
g,
b,
a = 0;
271 for (
i = 1;
i < 16;
i++) {
273 r = (
i & 1) ? 255 : 0;
274 g = (
i & 2) ? 255 : 0;
275 b = (
i & 4) ? 255 : 0;
277 r = (
i & 1) ? 127 : 0;
278 g = (
i & 2) ? 127 : 0;
279 b = (
i & 4) ? 127 : 0;
285 for (
i = 1;
i < 256;
i++) {
287 r = (
i & 1) ? 255 : 0;
288 g = (
i & 2) ? 255 : 0;
289 b = (
i & 4) ? 255 : 0;
294 r = ((
i & 1) ? 85 : 0) + ((
i & 0x10) ? 170 : 0);
295 g = ((
i & 2) ? 85 : 0) + ((
i & 0x20) ? 170 : 0);
296 b = ((
i & 4) ? 85 : 0) + ((
i & 0x40) ? 170 : 0);
300 r = ((
i & 1) ? 85 : 0) + ((
i & 0x10) ? 170 : 0);
301 g = ((
i & 2) ? 85 : 0) + ((
i & 0x20) ? 170 : 0);
302 b = ((
i & 4) ? 85 : 0) + ((
i & 0x40) ? 170 : 0);
306 r = 127 + ((
i & 1) ? 43 : 0) + ((
i & 0x10) ? 85 : 0);
307 g = 127 + ((
i & 2) ? 43 : 0) + ((
i & 0x20) ? 85 : 0);
308 b = 127 + ((
i & 4) ? 43 : 0) + ((
i & 0x40) ? 85 : 0);
312 r = ((
i & 1) ? 43 : 0) + ((
i & 0x10) ? 85 : 0);
313 g = ((
i & 2) ? 43 : 0) + ((
i & 0x20) ? 85 : 0);
314 b = ((
i & 4) ? 43 : 0) + ((
i & 0x40) ? 85 : 0);
328 if (
ctx->substream < 0) {
329 ctx->composition_id = -1;
330 ctx->ancillary_id = -1;
333 ctx->composition_id = -1;
334 ctx->ancillary_id = -1;
367 while (
ctx->display_list) {
368 display =
ctx->display_list;
369 ctx->display_list = display->
next;
378 uint8_t *destbuf,
int dbuf_len,
379 const uint8_t **srcbuf,
int buf_size,
380 int non_mod, uint8_t *map_table,
int x_pos)
386 int pixels_read = x_pos;
392 while (
get_bits_count(&gb) < buf_size << 3 && pixels_read < dbuf_len) {
396 if (non_mod != 1 ||
bits != 1) {
398 *destbuf++ = map_table[
bits];
409 if (non_mod == 1 &&
bits == 1)
410 pixels_read += run_length;
414 while (run_length-- > 0 && pixels_read < dbuf_len) {
427 if (non_mod == 1 &&
bits == 1)
428 pixels_read += run_length;
432 while (run_length-- > 0 && pixels_read < dbuf_len) {
437 }
else if (
bits == 3) {
441 if (non_mod == 1 &&
bits == 1)
442 pixels_read += run_length;
446 while (run_length-- > 0 && pixels_read < dbuf_len) {
451 }
else if (
bits == 1) {
457 while (run_length-- > 0 && pixels_read < dbuf_len) {
486 const uint8_t **srcbuf,
int buf_size,
487 int non_mod, uint8_t *map_table,
int x_pos)
493 int pixels_read = x_pos;
499 while (
get_bits_count(&gb) < buf_size << 3 && pixels_read < dbuf_len) {
503 if (non_mod != 1 ||
bits != 1) {
505 *destbuf++ = map_table[
bits];
515 if (run_length == 0) {
527 while (run_length-- > 0 && pixels_read < dbuf_len) {
537 if (non_mod == 1 &&
bits == 1)
538 pixels_read += run_length;
542 while (run_length-- > 0 && pixels_read < dbuf_len) {
553 if (non_mod == 1 &&
bits == 1)
554 pixels_read += run_length;
558 while (run_length-- > 0 && pixels_read < dbuf_len) {
563 }
else if (
bits == 3) {
567 if (non_mod == 1 &&
bits == 1)
568 pixels_read += run_length;
572 while (run_length-- > 0 && pixels_read < dbuf_len) {
577 }
else if (
bits == 1) {
583 while (run_length-- > 0 && pixels_read < dbuf_len) {
609 uint8_t *destbuf,
int dbuf_len,
610 const uint8_t **srcbuf,
int buf_size,
611 int non_mod, uint8_t *map_table,
int x_pos)
613 const uint8_t *sbuf_end = (*srcbuf) + buf_size;
616 int pixels_read = x_pos;
620 while (*srcbuf < sbuf_end && pixels_read < dbuf_len) {
624 if (non_mod != 1 ||
bits != 1) {
626 *destbuf++ = map_table[
bits];
633 run_length =
bits & 0x7f;
634 if ((
bits & 0x80) == 0) {
635 if (run_length == 0) {
643 if (non_mod == 1 &&
bits == 1)
644 pixels_read += run_length;
648 while (run_length-- > 0 && pixels_read < dbuf_len) {
664 uint8_t
list[256] = {0};
665 uint8_t list_inv[256];
666 int counttab[256] = {0};
667 int (*counttab2)[256] =
ctx->clut_count2;
671 memset(
ctx->clut_count2, 0 ,
sizeof(
ctx->clut_count2));
673 #define V(x,y) rect->data[0][(x) + (y)*stride]
674 for (y = 0; y<
h; y++) {
675 for (x = 0; x<
w; x++) {
677 int vl = x ?
V(x-1,y) + 1 : 0;
678 int vr = x+1<
w ?
V(x+1,y) + 1 : 0;
679 int vt = y ?
V(x,y-1) + 1 : 0;
680 int vb = y+1<
h ?
V(x,y+1) + 1 : 0;
681 counttab[v-1] += !!((v!=vl) + (v!=vr) + (v!=vt) + (v!=vb));
682 counttab2[vl][v-1] ++;
683 counttab2[vr][v-1] ++;
684 counttab2[vt][v-1] ++;
685 counttab2[vb][v-1] ++;
688 #define L(x,y) list[d[(x) + (y)*stride]]
690 for (
i = 0;
i<256;
i++) {
691 counttab2[
i+1][
i] = 0;
693 for (
i = 0;
i<256;
i++) {
697 for (x = 0; x < 256; x++) {
701 scorev += counttab2[0][x];
702 for (y = 0; y < 256; y++) {
703 scorev +=
list[y] * counttab2[y+1][x];
707 int score = 1024LL*scorev / counttab[x];
708 if (score > bestscore) {
717 list_inv[
i ] = bestv;
721 for (
i--;
i >= 0;
i--) {
722 int v =
i * 255 / count;
736 const uint32_t *clut_table;
738 int offset_x=0, offset_y=0;
743 offset_x = display_def->
x;
744 offset_y = display_def->
y;
748 if (
sub->num_rects) {
752 for (display =
ctx->display_list; display; display = display->
next) {
754 if (region && region->
dirty)
758 if (
ctx->compute_edt == 0) {
759 sub->end_display_time =
ctx->time_out * 1000;
765 if (
sub->num_rects > 0) {
773 for (
i = 0;
i <
sub->num_rects;
i++) {
775 if (!
sub->rects[
i]) {
783 for (display =
ctx->display_list; display; display = display->
next) {
806 switch (region->
depth) {
808 clut_table = clut->
clut4;
815 clut_table = clut->
clut16;
820 if (!
rect->data[1]) {
824 memcpy(
rect->data[1], clut_table, (1 << region->
depth) *
sizeof(*clut_table));
827 if (!
rect->data[0]) {
848 for (
i=0;
i <
sub->num_rects;
i++) {
863 const uint8_t *buf,
int buf_size,
int top_bottom,
int non_mod)
868 const uint8_t *buf_end = buf + buf_size;
873 uint8_t map2to4[] = { 0x0, 0x7, 0x8, 0xf};
874 uint8_t map2to8[] = {0x00, 0x77, 0x88, 0xff};
875 uint8_t map4to8[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
876 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
880 ff_dlog(avctx,
"DVB pixel block size %d, %s field:\n", buf_size,
881 top_bottom ?
"bottom" :
"top");
883 for (
i = 0;
i < buf_size;
i++) {
902 x_pos = display->
x_pos;
903 y_pos = display->
y_pos;
907 while (buf < buf_end) {
908 if ((*buf!=0xf0 && x_pos >= region->
width) || y_pos >= region->
height) {
915 if (region->
depth == 8)
917 else if (region->
depth == 4)
923 region->
width, &buf, buf_end - buf,
924 non_mod, map_table, x_pos);
927 if (region->
depth < 4) {
932 if (region->
depth == 8)
938 region->
width, &buf, buf_end - buf,
939 non_mod, map_table, x_pos);
942 if (region->
depth < 8) {
948 region->
width, &buf, buf_end - buf,
949 non_mod,
NULL, x_pos);
953 map2to4[0] = (*buf) >> 4;
954 map2to4[1] = (*buf++) & 0
xf;
955 map2to4[2] = (*buf) >> 4;
956 map2to4[3] = (*buf++) & 0
xf;
959 for (
i = 0;
i < 4;
i++)
963 for (
i = 0;
i < 16;
i++)
968 x_pos = display->
x_pos;
976 if (
ctx->compute_clut != -2)
981 const uint8_t *buf,
int buf_size)
985 const uint8_t *buf_end = buf + buf_size;
989 int top_field_len, bottom_field_len;
991 int coding_method, non_modifying_color;
1001 coding_method = ((*buf) >> 2) & 3;
1002 non_modifying_color = ((*buf++) >> 1) & 1;
1004 if (coding_method == 0) {
1007 bottom_field_len =
AV_RB16(buf);
1010 if (buf + top_field_len + bottom_field_len > buf_end) {
1011 av_log(avctx,
AV_LOG_ERROR,
"Field data size %d+%d too large\n", top_field_len, bottom_field_len);
1016 const uint8_t *
block = buf;
1017 int bfl = bottom_field_len;
1020 non_modifying_color);
1022 if (bottom_field_len > 0)
1023 block = buf + top_field_len;
1025 bfl = top_field_len;
1028 non_modifying_color);
1030 }
else if (coding_method == 1) {
1033 }
else if (coding_method == 2) {
1045 const uint8_t *buf,
int buf_size)
1049 const uint8_t *buf_end = buf + buf_size;
1055 int r,
g,
b, r_add, g_add, b_add;
1057 ff_dlog(avctx,
"DVB clut packet:\n");
1059 for (
i=0;
i < buf_size;
i++) {
1083 ctx->clut_list = clut;
1090 while (buf + 4 < buf_end) {
1093 depth = (*buf) & 0xe0;
1108 cr = (((buf[0] & 3) << 2) | ((buf[1] >> 6) & 3)) << 4;
1109 cb = (buf[1] << 2) & 0xf0;
1110 alpha = (buf[1] << 6) & 0xc0;
1121 ff_dlog(avctx,
"clut %d := (%d,%d,%d,%d)\n", entry_id,
r,
g,
b,
alpha);
1122 if (!!(depth & 0x80) + !!(depth & 0x40) + !!(depth & 0x20) > 1) {
1123 ff_dlog(avctx,
"More than one bit level marked: %x\n", depth);
1128 if (depth & 0x80 && entry_id < 4)
1130 else if (depth & 0x40 && entry_id < 16)
1132 else if (depth & 0x20)
1142 const uint8_t *buf,
int buf_size)
1146 const uint8_t *buf_end = buf + buf_size;
1147 int region_id, object_id;
1167 region->
id = region_id;
1170 region->
next =
ctx->region_list;
1171 ctx->region_list = region;
1175 fill = ((*buf++) >> 3) & 1;
1183 if (
ret >= 0 && region->
width * region->
height * 2 > 320 * 1024 * 8) {
1198 if (!region->
pbuf) {
1209 region->
depth = 1 << (((*buf++) >> 2) & 7);
1210 if (region->
depth < 2 || region->
depth > 8) {
1214 region->
clut = *buf++;
1216 if (region->
depth == 8) {
1222 if (region->
depth == 4)
1223 region->
bgcolor = (((*buf++) >> 4) & 15);
1225 region->
bgcolor = (((*buf++) >> 2) & 3);
1237 while (buf + 5 < buf_end) {
1248 object->id = object_id;
1249 object->next =
ctx->object_list;
1250 ctx->object_list = object;
1253 object->
type = (*buf) >> 6;
1274 if ((object->
type == 1 || object->
type == 2) && buf+1 < buf_end) {
1283 object->display_list = display;
1290 const uint8_t *buf,
int buf_size,
AVSubtitle *
sub,
int *got_output)
1296 const uint8_t *buf_end = buf + buf_size;
1307 page_state = ((*buf++) >> 2) & 3;
1313 ctx->time_out = timeout;
1316 ff_dlog(avctx,
"Page time out %ds, state %d\n",
ctx->time_out, page_state);
1318 if (
ctx->compute_edt == 1)
1321 if (page_state == 1 || page_state == 2) {
1327 tmp_display_list =
ctx->display_list;
1330 while (buf + 5 < buf_end) {
1334 display =
ctx->display_list;
1335 while (display && display->
region_id != region_id) {
1336 display = display->
next;
1343 display = tmp_display_list;
1344 tmp_ptr = &tmp_display_list;
1346 while (display && display->
region_id != region_id) {
1347 tmp_ptr = &display->
next;
1348 display = display->
next;
1364 *tmp_ptr = display->
next;
1366 display->
next =
ctx->display_list;
1367 ctx->display_list = display;
1369 ff_dlog(avctx,
"Region %d, (%d,%d)\n", region_id, display->
x_pos, display->
y_pos);
1372 while (tmp_display_list) {
1373 display = tmp_display_list;
1375 tmp_display_list = display->
next;
1385 static void png_save(
DVBSubContext *
ctx,
const char *filename, uint32_t *bitmap,
int w,
int h)
1389 char fname[40], fname2[40];
1392 snprintf(fname,
sizeof(fname),
"%s.ppm", filename);
1394 f = fopen(fname,
"w");
1403 for(y = 0; y <
h; y++) {
1404 for(x = 0; x <
w; x++) {
1405 v = bitmap[y *
w + x];
1406 putc((v >> 16) & 0xff,
f);
1407 putc((v >> 8) & 0xff,
f);
1408 putc((v >> 0) & 0xff,
f);
1414 snprintf(fname2,
sizeof(fname2),
"%s-a.pgm", filename);
1416 f = fopen(fname2,
"w");
1425 for(y = 0; y <
h; y++) {
1426 for(x = 0; x <
w; x++) {
1427 v = bitmap[y *
w + x];
1428 putc((v >> 24) & 0xff,
f);
1433 snprintf(
command,
sizeof(
command),
"pnmtopng -alpha %s %s > %s.png 2> /dev/null", fname2, fname, filename);
1451 const uint32_t *clut_table;
1453 int x, y, y_off, x_off;
1456 static int fileno_index = 0;
1463 for (display =
ctx->display_list; display; display = display->
next) {
1470 x_pos = display->
x_pos;
1471 y_pos = display->
y_pos;
1475 if (display->
x_pos < x_pos) {
1477 x_pos = display->
x_pos;
1480 if (display->
y_pos < y_pos) {
1482 y_pos = display->
y_pos;
1501 for (display =
ctx->display_list; display; display = display->
next) {
1507 x_off = display->
x_pos - x_pos;
1508 y_off = display->
y_pos - y_pos;
1515 switch (region->
depth) {
1517 clut_table = clut->
clut4;
1524 clut_table = clut->
clut16;
1528 for (y = 0; y < region->
height; y++) {
1529 for (x = 0; x < region->
width; x++) {
1530 pbuf[((y + y_off) *
width) + x_off + x] =
1531 clut_table[region->
pbuf[y * region->
width + x]];
1537 snprintf(filename,
sizeof(filename),
"dvbs.%d", fileno_index);
1555 int dds_version, info_byte;
1560 info_byte = bytestream_get_byte(&buf);
1561 dds_version = info_byte >> 4;
1562 if (display_def && display_def->
version == dds_version)
1566 display_def =
av_mallocz(
sizeof(*display_def));
1569 ctx->display_definition = display_def;
1572 display_def->
version = dds_version;
1575 display_def->
width = bytestream_get_be16(&buf) + 1;
1576 display_def->
height = bytestream_get_be16(&buf) + 1;
1583 if (info_byte & 1<<3) {
1587 display_def->
x = bytestream_get_be16(&buf);
1588 display_def->
width = bytestream_get_be16(&buf) - display_def->
x + 1;
1589 display_def->
y = bytestream_get_be16(&buf);
1590 display_def->
height = bytestream_get_be16(&buf) - display_def->
y + 1;
1601 if (
ctx->compute_edt == 0)
1604 save_display_set(
ctx);
1610 void *
data,
int *got_sub_ptr,
1613 const uint8_t *buf = avpkt->
data;
1614 int buf_size = avpkt->
size;
1617 const uint8_t *p, *p_end;
1623 int got_segment = 0;
1626 ff_dlog(avctx,
"DVB sub packet:\n");
1628 for (
i=0;
i < buf_size;
i++) {
1637 if (buf_size <= 6 || *buf != 0x0f) {
1638 ff_dlog(avctx,
"incomplete or broken packet");
1643 p_end = buf + buf_size;
1645 while (p_end - p >= 6 && *p == 0x0f) {
1647 segment_type = *p++;
1654 av_log(avctx,
AV_LOG_DEBUG,
"segment_type:%d page_id:%d segment_length:%d\n", segment_type, page_id, segment_length);
1657 if (p_end - p < segment_length) {
1658 ff_dlog(avctx,
"incomplete or broken packet");
1663 if (page_id ==
ctx->composition_id || page_id ==
ctx->ancillary_id ||
1664 ctx->composition_id == -1 ||
ctx->ancillary_id == -1) {
1666 switch (segment_type) {
1677 if (
ret < 0)
goto end;
1691 if (got_segment == 15 && !got_dds && !avctx->
width && !avctx->
height) {
1699 ff_dlog(avctx,
"Subtitling segment type 0x%x, page id %d, length %d\n",
1700 segment_type, page_id, segment_length);
1707 p += segment_length;
1711 if (got_segment == 15) {
1720 if (
ctx->compute_edt == 1)
1727 #define DS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_SUBTITLE_PARAM
1728 #define OFFSET(x) offsetof(DVBSubContext, x)
1730 {
"compute_edt",
"compute end of time using pts or timeout",
OFFSET(compute_edt),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
DS},
1731 {
"compute_clut",
"compute clut when not available(-1) or only once (-2) or always(1) or never(0)",
OFFSET(compute_clut),
AV_OPT_TYPE_BOOL, {.i64 = -1}, -2, 1,
DS},
#define AV_LOG_WARNING
Something somehow does not look correct.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
#define DVBSUB_DISPLAY_SEGMENT
static void delete_cluts(DVBSubContext *ctx)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static double cb(void *priv, double x, double y)
static float sub(float src0, float src1)
static const AVClass dvbsubdec_class
static DVBSubRegion * get_region(DVBSubContext *ctx, int region_id)
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
static int dvbsub_parse_region_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static int get_bits_count(const GetBitContext *s)
int compute_edt
if 1 end display time calculated using pts if 0 (Default) calculated using time out
static const AVOption options[]
#define DVBSUB_PAGE_SEGMENT
DVBSubObjectDisplay * display_list
#define YUV_TO_RGB1_CCIR(cb1, cr1)
static void delete_objects(DVBSubContext *ctx)
DVBSubRegionDisplay * display_list
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
static void compute_default_clut(DVBSubContext *ctx, uint8_t *clut, AVSubtitleRect *rect, int w, int h)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static DVBSubObject * get_object(DVBSubContext *ctx, int object_id)
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of a plane of an image with...
@ AV_CODEC_ID_DVB_SUBTITLE
DVBSubRegion * region_list
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
#define DVBSUB_DISPLAYDEFINITION_SEGMENT
DVBSubObjectDisplay * display_list
#define av_assert0(cond)
assert() equivalent, that is always enabled.
struct DVBSubObjectDisplay * region_list_next
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
#define DVBSUB_CLUT_SEGMENT
int64_t max_pixels
The number of pixels per image to maximally accept.
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
static void delete_regions(DVBSubContext *ctx)
#define DVBSUB_OBJECT_SEGMENT
static int dvbsub_decode(AVCodecContext *avctx, void *data, int *got_sub_ptr, AVPacket *avpkt)
static int save_subtitle_set(AVCodecContext *avctx, AVSubtitle *sub, int *got_output)
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
static int dvbsub_parse_display_definition_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static av_cold int dvbsub_close_decoder(AVCodecContext *avctx)
Rational number (pair of numerator and denominator).
static int dvbsub_parse_clut_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
FFmpeg currently uses a custom build system
const char * av_default_item_name(void *ptr)
Return the context name.
static unsigned int get_bits1(GetBitContext *s)
static void dvbsub_parse_pixel_data_block(AVCodecContext *avctx, DVBSubObjectDisplay *display, const uint8_t *buf, int buf_size, int top_bottom, int non_mod)
#define DVBSUB_REGION_SEGMENT
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
#define YUV_TO_RGB2_CCIR(r, g, b, y1)
static int dvbsub_parse_object_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
static int dvbsub_read_2bit_string(AVCodecContext *avctx, uint8_t *destbuf, int dbuf_len, const uint8_t **srcbuf, int buf_size, int non_mod, uint8_t *map_table, int x_pos)
struct DVBSubRegion * next
static int dvbsub_display_end_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size, AVSubtitle *sub, int *got_output)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static av_cold void init_default_clut(void)
#define AV_NOPTS_VALUE
Undefined timestamp value.
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
DVBSubDisplayDefinition * display_definition
static DVBSubCLUT * get_clut(DVBSubContext *ctx, int clut_id)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
#define FF_COMPLIANCE_NORMAL
static void delete_region_display_list(DVBSubContext *ctx, DVBSubRegion *region)
@ SUBTITLE_BITMAP
A bitmap, pict will be set.
#define AV_LOG_INFO
Standard information.
#define i(width, name, range_min, range_max)
struct DVBSubObject * next
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
#define xf(width, name, var, range_min, range_max, subs,...)
#define FF_DEBUG_STARTCODE
static av_cold int dvbsub_init_decoder(AVCodecContext *avctx)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const char * name
Name of the codec implementation.
void * av_calloc(size_t nmemb, size_t size)
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
#define FFSWAP(type, a, b)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
uint8_t computed_clut[4 *256]
main external API structure.
static DVBSubCLUT default_clut
int clut_count2[257][256]
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
#define avpriv_request_sample(...)
struct DVBSubObjectDisplay * object_list_next
static const int16_t alpha[]
DVBSubObject * object_list
This structure stores compressed data.
static double cr(void *priv, double x, double y)
static int dvbsub_read_8bit_string(AVCodecContext *avctx, uint8_t *destbuf, int dbuf_len, const uint8_t **srcbuf, int buf_size, int non_mod, uint8_t *map_table, int x_pos)
static int dvbsub_read_4bit_string(AVCodecContext *avctx, uint8_t *destbuf, int dbuf_len, const uint8_t **srcbuf, int buf_size, int non_mod, uint8_t *map_table, int x_pos)
int width
picture width / height.
The exact code depends on how similar the blocks are and how related they are to the block
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int dvbsub_parse_page_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size, AVSubtitle *sub, int *got_output)
const AVCodec ff_dvbsub_decoder
struct DVBSubRegionDisplay * next
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16