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(¶ms, image);
jbig2_release_page(ctx, image);