shithub: jbig2

Download patch

ref: a16825bb84c139c37b76c48d1ab22aa3431ad0fe
parent: 5bc215cd78619abe678381de5a63d603dfa1bbd3
author: Sebastian Rasmussen <sebras@gmail.com>
date: Thu Apr 19 22:33:31 EDT 2018

jbig2dec: Check for T.88 amendments 2/3 bitstreams.

T.88 Amendment 2 adds up to 12 adaptive template pixels in generic regions.
T.88 Amendment 3 adds support for generic/text regions to encode colors.
Neither amendment is implemented and no sample files have been found.
Return fatal errors for such bitstreams/files for the time being.

--- a/jbig2.c
+++ b/jbig2.c
@@ -256,6 +256,12 @@
                 return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, "not a JBIG2 file header");
             /* D.4.2 */
             ctx->file_header_flags = ctx->buf[ctx->buf_rd_ix + 8];
+            /* Check for T.88 amendment 2 */
+            if (ctx->file_header_flags & 0x04)
+                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, "file header indicates use of 12 adaptive template pixels (NYI)");
+            /* Check for T.88 amendment 3 */
+            if (ctx->file_header_flags & 0x08)
+                return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, -1, "file header indicates use of colored region segments (NYI)");
             if (ctx->file_header_flags & 0xFC) {
                 jbig2_error(ctx, JBIG2_SEVERITY_WARNING, -1, "reserved bits (2-7) of file header flags are not zero (0x%02x)", ctx->file_header_flags);
             }
--- a/jbig2_generic.c
+++ b/jbig2_generic.c
@@ -806,6 +806,10 @@
 
     offset = 18 + gbat_bytes;
 
+    /* Check for T.88 amendment 2 */
+    if ((seg_flags >> 5) & 1)
+        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment uses 12 adaptive template pixels (NYI)");
+
     /* Table 34 */
     params.MMR = seg_flags & 1;
     params.GBTEMPLATE = (seg_flags & 6) >> 1;
--- a/jbig2_page.c
+++ b/jbig2_page.c
@@ -109,6 +109,9 @@
     page->x_resolution = jbig2_get_uint32(segment_data + 8);
     page->y_resolution = jbig2_get_uint32(segment_data + 12);
     page->flags = segment_data[16];
+    /* Check for T.88 amendment 3 */
+    if (page->flags & 0x80)
+        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "page segment indicates use of color segments (NYI)");
 
     /* 7.4.8.6 */
     {
--- a/jbig2_segment.c
+++ b/jbig2_segment.c
@@ -282,6 +282,8 @@
         return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "unhandled segment type 'profile'");
     case 53:                   /* user-supplied huffman table */
         return jbig2_table(ctx, segment, segment_data);
+    case 54:
+        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "unhandled segment type 'color palette'");
     case 62:
         return jbig2_parse_extension_segment(ctx, segment, segment_data);
     default:
--- a/jbig2_text.c
+++ b/jbig2_text.c
@@ -579,6 +579,9 @@
         goto too_short;
     jbig2_get_region_segment_info(&region_info, segment_data);
     offset += 17;
+    /* Check for T.88 amendment 3 */
+    if (region_info.flags & 8)
+        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "region segment flags indicate use of colored bitmap (NYI)");
 
     /* 7.4.3.1.1 */
     if (segment->data_length - offset < 2)