-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
-/*
- * libdvbsub - DVB subtitle decoding
+/* dvb-sub.c - DVB subtitle decoding
* Copyright (C) Mart Raudsepp 2009 <mart.raudsepp@artecdesign.ee>
+ * Copyright (C) 2010 ONELAN Ltd.
*
* Heavily uses code algorithms ported from ffmpeg's libavcodec/dvbsubdec.c,
* especially the segment parsers. The original license applies to this
* and signalling the API user for new bitmaps to show on screen.
*/
-#define MAX_NEG_CROP 1024
-
#define AYUV(y,u,v,a) (((a) << 24) | ((y) << 16) | ((u) << 8) | (v))
#define RGBA_TO_AYUV(r,g,b,a) (((a) << 24) | ((rgb_to_y(r,g,b)) << 16) | ((rgb_to_u(r,g,b)) << 8) | (rgb_to_v(r,g,b)))
guint8 region_id;
guint8 page_state;
-#ifndef GST_DISABLE_GST_DEBUG
- static int counter = 0; /* FIXME: static counter? I think not.. */
-#endif
-
if (buf_size < 1)
return;
"Normal case", "ACQUISITION POINT", "Mode Change", "RESERVED"
};
- ++counter;
- GST_DEBUG ("PAGE: %d: page_id = %u, length = %d, page_time_out = %u secs, "
- "page_state = %s", counter, page_id, buf_size, dvb_sub->page_time_out,
+ GST_DEBUG ("PAGE: page_id = %u, length = %d, page_time_out = %u secs, "
+ "page_state = %s", page_id, buf_size, dvb_sub->page_time_out,
page_state_str[page_state]);
}
#endif
dvb_sub->display_list = display;
dvb_sub->display_list_size++;
- GST_LOG ("PAGE %d: REGION information: ID = %u, address = %ux%u",
- counter, region_id, display->x_pos, display->y_pos);
+ GST_LOG ("PAGE: REGION information: ID = %u, address = %ux%u", region_id,
+ display->x_pos, display->y_pos);
}
while (tmp_display_list) {
clut = get_clut (dvb_sub, clut_id);
if (!clut) {
- clut = g_slice_new (DVBSubCLUT); /* FIXME-MEMORY-LEAK: This seems to leak per valgrind */
+ clut = g_slice_new (DVBSubCLUT);
memcpy (clut, &default_clut, sizeof (DVBSubCLUT));
while (!stop_parsing && (gst_bit_reader_get_remaining (&gb) > 0)) {
guint run_length = 0, clut_index = 0;
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 2);
+
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2);
if (bits) { /* 2-bit_pixel-code */
run_length = 1;
clut_index = bits;
} else { /* 2-bit_zero */
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 1);
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1);
if (bits == 1) { /* switch_1 == '1' */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 3);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 3);
run_length += 3;
- gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 2);
+ clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2);
} else { /* switch_1 == '0' */
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 1);
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1);
if (bits == 1) { /* switch_2 == '1' */
run_length = 1; /* 1x pseudo-colour '00' */
} else { /* switch_2 == '0' */
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 2);
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2);
switch (bits) { /* switch_3 */
case 0x0: /* end of 2-bit/pixel_code_string */
stop_parsing = TRUE;
run_length = 2;
break;
case 0x2: /* the following 6 bits contain run length coded pixel data */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 4);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4);
run_length += 12;
- gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 2);
+ clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2);
break;
case 0x3: /* the following 10 bits contain run length coded pixel data */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 8);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 8);
run_length += 29;
- gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 2);
+ clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2);
break;
}
}
GST_TRACE ("RUNLEN: setting %u pixels to color 0x%x in destination buffer, "
"dbuf_len left is %d pixels", run_length, clut_index, dbuf_len);
- if (!(non_mod == 1 && bits == 1))
+ if (!(non_mod == 1 && clut_index == 1))
memset (destbuf, clut_index, run_length);
destbuf += run_length;
while (!stop_parsing && (gst_bit_reader_get_remaining (&gb) > 0)) {
guint run_length = 0, clut_index = 0;
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 4);
+
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4);
if (bits) {
run_length = 1;
clut_index = bits;
} else {
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 1);
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1);
if (bits == 0) { /* switch_1 == '0' */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 3);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 3);
if (!run_length) {
stop_parsing = TRUE;
} else {
run_length += 2;
}
} else { /* switch_1 == '1' */
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 1);
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1);
if (bits == 0) { /* switch_2 == '0' */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 2);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2);
run_length += 4;
- gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 4);
+ clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4);
} else { /* switch_2 == '1' */
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 2);
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 2);
switch (bits) {
case 0x0: /* switch_3 == '00' */
run_length = 1; /* 1 pixel of pseudo-color 0 */
run_length = 2; /* 2 pixels of pseudo-color 0 */
break;
case 0x2: /* switch_3 == '10' */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 4);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4);
run_length += 9;
- gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 4);
+ clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4);
break;
case 0x3: /* switch_3 == '11' */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 8);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 8);
run_length += 25;
- gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 4);
+ clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 4);
break;
}
}
GST_TRACE ("RUNLEN: setting %u pixels to color 0x%x in destination buffer; "
"dbuf_len left is %d pixels", run_length, clut_index, dbuf_len);
- if (!(non_mod == 1 && bits == 1))
+ if (!(non_mod == 1 && clut_index == 1))
memset (destbuf, clut_index, run_length);
destbuf += run_length;
/* Rephrased - it's better to work with bytes with default value '0' instead of reading from memory we don't own. */
while (!stop_parsing && (gst_bit_reader_get_remaining (&gb) > 0)) {
guint run_length = 0, clut_index = 0;
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 8);
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 8);
if (bits) { /* 8-bit_pixel-code */
run_length = 1;
clut_index = bits;
} else { /* 8-bit_zero */
- gst_bit_reader_get_bits_uint32 (&gb, &bits, 1);
+ bits = gst_bit_reader_get_bits_uint32_unchecked (&gb, 1);
if (bits == 0) { /* switch_1 == '0' */
/* run_length_1-127 for pseudo-colour _entry) '0x00' */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 7);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 7);
if (run_length == 0) { /* end_of_string_signal */
stop_parsing = TRUE;
}
} else { /* switch_1 == '1' */
/* run_length_3-127 */
- gst_bit_reader_get_bits_uint32 (&gb, &run_length, 7);
- gst_bit_reader_get_bits_uint32 (&gb, &clut_index, 8);
+ run_length = gst_bit_reader_get_bits_uint32_unchecked (&gb, 7);
+ clut_index = gst_bit_reader_get_bits_uint32_unchecked (&gb, 8);
if (run_length < 3) {
GST_WARNING ("runlength value was %u, but the spec requires it "
GST_TRACE ("RUNLEN: setting %u pixels to color 0x%x in destination buffer; "
"dbuf_len left is %d pixels", run_length, clut_index, dbuf_len);
- if (!(non_mod == 1 && bits == 1))
+ if (!(non_mod == 1 && clut_index == 1))
memset (destbuf, clut_index, run_length);
destbuf += run_length;
guint32 *clut_table;
int i;
- static unsigned counter = 0; /* DEBUG use only *//* FIXME: get rid */
-
GST_DEBUG ("DISPLAY SET END: page_id = %u, length = %d", page_id, buf_size);
sub = g_slice_new0 (DVBSubtitles);
rect->pict.data = g_malloc (region->buf_size); /* FIXME: Can we use GSlice here? */
memcpy (rect->pict.data, region->pbuf, region->buf_size);
- ++counter;
- GST_DEBUG ("DISPLAY: an object rect created: number %u, iteration %u, "
- "pos: %d:%d, size: %dx%d", counter, i, rect->x, rect->y, rect->w,
- rect->h);
+ GST_DEBUG ("DISPLAY: an object rect created: iteration %u, "
+ "pos: %d:%d, size: %dx%d", i, rect->x, rect->y, rect->w, rect->h);
GST_MEMDUMP ("rect->pict.data content", rect->pict.data, region->buf_size);