dvbsuboverlay: Handle non_modifying_colour_flag correctly in the RLE handlers
[platform/upstream/gstreamer.git] / gst / dvbsuboverlay / dvb-sub.c
index 435de92..21061a3 100644 (file)
@@ -1,7 +1,6 @@
-/* -*- 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
@@ -53,8 +52,6 @@ static void dvb_sub_init (void);
  * 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)))
 
@@ -374,10 +371,6 @@ _dvb_sub_parse_page_segment (DvbSub * dvb_sub, guint16 page_id, guint8 * buf,
   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;
 
@@ -390,9 +383,8 @@ _dvb_sub_parse_page_segment (DvbSub * dvb_sub, guint16 page_id, guint8 * buf,
       "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
@@ -433,8 +425,8 @@ _dvb_sub_parse_page_segment (DvbSub * dvb_sub, guint16 page_id, guint8 * buf,
     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) {
@@ -587,7 +579,7 @@ _dvb_sub_parse_clut_segment (DvbSub * dvb_sub, guint16 page_id, guint8 * buf,
   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));
 
@@ -663,23 +655,24 @@ _dvb_sub_read_2bit_string (guint8 * destbuf, gint dbuf_len,
 
   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;
@@ -688,14 +681,14 @@ _dvb_sub_read_2bit_string (guint8 * destbuf, gint dbuf_len,
               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;
           }
         }
@@ -722,7 +715,7 @@ _dvb_sub_read_2bit_string (guint8 * destbuf, gint dbuf_len,
     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;
@@ -755,28 +748,29 @@ _dvb_sub_read_4bit_string (guint8 * destbuf, gint dbuf_len,
 
   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 */
@@ -785,14 +779,14 @@ _dvb_sub_read_4bit_string (guint8 * destbuf, gint dbuf_len,
               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;
           }
         }
@@ -819,7 +813,7 @@ _dvb_sub_read_4bit_string (guint8 * destbuf, gint dbuf_len,
     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;
@@ -866,23 +860,23 @@ _dvb_sub_read_8bit_string (guint8 * destbuf, gint dbuf_len,
   /* 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 "
@@ -911,7 +905,7 @@ _dvb_sub_read_8bit_string (guint8 * destbuf, gint dbuf_len,
     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;
@@ -1201,8 +1195,6 @@ _dvb_sub_parse_end_of_display_set (DvbSub * dvb_sub, guint16 page_id,
   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);
@@ -1275,10 +1267,8 @@ _dvb_sub_parse_end_of_display_set (DvbSub * dvb_sub, guint16 page_id,
     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);