jbig2dec

Ralph Giles <[email protected]> Tue, 09 Jul 2002 02:45:34 -0700
Newsgroups gmane.comp.printing.ghostscript.jbig2dec.cvs
Message-ID <[email protected]>
Update of /cvsroot/jbig2dec/jbig2dec
In directory usw-pr-cvs1:/tmp/cvs-serv4221

Modified Files:
	jbig2.h jbig2_page.c jbig2_priv.h jbig2_segment.c jbig2dec.c 
Log Message:
Work around missing end-of-page segment in CVision's PDF-embedded jbig2 streams.
jbig2_complete_page() becomes a public function marking the current page finished
so the client can call it at end-of-data, since data-shovel interface has no way
of passing that out-of-band. The segment dispatch calls a new jbig2_parse_end_of_page()
which does error checking and then calls jbig2_complete_page().


Index: jbig2.h
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- jbig2.h	8 Jul 2002 14:26:02 -0000	1.13
+++ jbig2.h	9 Jul 2002 09:45:32 -0000	1.14
@@ -85,6 +85,9 @@
 Jbig2Image *jbig2_page_out (Jbig2Ctx *ctx);
 /* mark a returned page image as read */
 int jbig2_release_page (Jbig2Ctx *ctx, Jbig2Image *image);
+/* mark the current page as complete, regardless of decoder state (for broken streams) */
+int jbig2_complete_page (Jbig2Ctx *ctx);
+
 
 /* segment header routines */
 

Index: jbig2_page.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_page.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- jbig2_page.c	8 Jul 2002 14:54:01 -0000	1.11
+++ jbig2_page.c	9 Jul 2002 09:45:32 -0000	1.12
@@ -167,20 +167,34 @@
  * of the page image will also happen from here (NYI)
  **/
 int
-jbig2_complete_page (Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)
+jbig2_complete_page (Jbig2Ctx *ctx)
 {
     uint32_t page_number = ctx->pages[ctx->current_page].number;
-    
+        
+    ctx->pages[ctx->current_page].state = JBIG2_PAGE_COMPLETE;
+
+    return 0;
+}
+
+/**
+ * jbig2_parse_end_of_page: parse an end of page segment
+ **/
+int
+jbig2_parse_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)
+{
+    uint32_t page_number = ctx->pages[ctx->current_page].number;
+
     if (segment->page_association != page_number) {
         jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
             "end of page marker for page %d doesn't match current page number %d",
             segment->page_association, page_number);
     }
     
-    ctx->pages[ctx->current_page].state = JBIG2_PAGE_COMPLETE;
     jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number,
         "end of page %d", page_number);
 
+    jbig2_complete_page(ctx);
+    
 #ifdef OUTPUT_PBM
     jbig2_image_write_pbm(ctx->pages[ctx->current_page].image, stdout);
 #endif
@@ -228,6 +242,7 @@
     /* find the matching page struct and mark it released */
     for (index = 0; index < ctx->max_page_index; index++) {
         if (ctx->pages[index].image == image) {
+            /* todo: free associated image */
             ctx->pages[index].state = JBIG2_PAGE_RELEASED;
             jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, -1,
                 "page %d released by the client", ctx->pages[index].number);

Index: jbig2_priv.h
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_priv.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- jbig2_priv.h	8 Jul 2002 19:23:11 -0000	1.13
+++ jbig2_priv.h	9 Jul 2002 09:45:32 -0000	1.14
@@ -111,7 +111,7 @@
 };
 
 int jbig2_parse_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);
-int jbig2_complete_page (Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);
+int jbig2_parse_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);
 
 typedef enum {
     JBIG2_COMPOSE_OR = 0,

Index: jbig2_segment.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_segment.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- jbig2_segment.c	8 Jul 2002 19:23:11 -0000	1.16
+++ jbig2_segment.c	9 Jul 2002 09:45:32 -0000	1.17
@@ -84,7 +84,8 @@
             jbig2_get_int32(buf + offset);
         offset += referred_to_segment_size;
         jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number,
-            "refers to segment %d", referred_to_segments[i]);
+            "segment %d refers to segment %d",
+            result->number, ctx->segments[referred_to_segments[i]]->number);
       }
       result->referred_to_segments = referred_to_segments;
     }
@@ -185,7 +186,7 @@
     case 48:
       return jbig2_parse_page_info(ctx, segment, segment_data);
     case 49:
-      return jbig2_complete_page(ctx, segment, segment_data);
+      return jbig2_parse_end_of_page(ctx, segment, segment_data);
     case 50:
       return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number,
         "unhandled segment type 'end of stripe'");

Index: jbig2dec.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2dec.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- jbig2dec.c	8 Jul 2002 14:54:02 -0000	1.28
+++ jbig2dec.c	9 Jul 2002 09:45:32 -0000	1.29
@@ -259,6 +259,11 @@
   {
     Jbig2Image *image;
     
+    /* work around broken CVision embedded streams */
+    if (f_page != NULL)
+      jbig2_complete_page(ctx);
+    
+    /* retrieve and write out all the completed pages */
     while ((image = jbig2_page_out(ctx)) != NULL) {
       write_page_image(&params, image);
       jbig2_release_page(ctx, image);