jpeg错误打印结构

 

 1 struct jpeg_error_mgr {
 2   /* Error exit handler: does not return to caller */
 3   JMETHOD(void, error_exit, (j_common_ptr cinfo));
 4   /* Conditionally emit a trace or warning message */
 5   JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
 6   /* Routine that actually outputs a trace or error message */
 7   JMETHOD(void, output_message, (j_common_ptr cinfo));
 8   /* Format a message string for the most recent JPEG error or message */
 9   JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
10 #define JMSG_LENGTH_MAX  200    /* recommended size of format_message buffer */
11   /* Reset error state variables at start of a new image */
12   JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
13   
14   /* The message ID code and any parameters are saved here.
15    * A message can have one string parameter or up to 8 int parameters.
16    */
17   int msg_code;//取之参考http://www.cnblogs.com/black-mamba/p/6754493.html
18 #define JMSG_STR_PARM_MAX  80
19   union {
20     int i[8];
21     char s[JMSG_STR_PARM_MAX];
22   } msg_parm;
23   
24   /* Standard state variables for error facility */
25   
26   int trace_level;        /* max msg_level that will be displayed */
27   
28   /* For recoverable corrupt-data errors, we emit a warning message,
29    * but keep going unless emit_message chooses to abort.  emit_message
30    * should count warnings in num_warnings.  The surrounding application
31    * can check for bad data by seeing if num_warnings is nonzero at the
32    * end of processing.
33    */
34   long num_warnings;        /* number of corrupt-data warnings */
35 
36   /* These fields point to the table(s) of error message strings.
37    * An application can change the table pointer to switch to a different
38    * message list (typically, to change the language in which errors are
39    * reported).  Some applications may wish to add additional error codes
40    * that will be handled by the JPEG library error mechanism; the second
41    * table pointer is used for this purpose.
42    *
43    * First table includes all errors generated by JPEG library itself.
44    * Error code 0 is reserved for a "no such error string" message.
45    */
46   const char * const * jpeg_message_table; /* Library errors */
47   int last_jpeg_message;    /* Table contains strings 0..last_jpeg_message */
48   /* Second table can be added by application (see cjpeg/djpeg for example).
49    * It contains strings numbered first_addon_message..last_addon_message.
50    */
51   const char * const * addon_message_table; /* Non-library errors */
52   int first_addon_message;    /* code for first string in addon table */
53   int last_addon_message;    /* code for last string in addon table */
54 };

jpeg_error_mgr结构体中的函数指针是在调用jpeg_std_error()后被初始化的。可自定义这些函数指针也可使用默认函数。

注意msg_parm支持一个字符串或8个int参数。

jerror.h中包含了一些错误打印宏,下面以ERREXIT1为例进行说明:

1 #define ERREXIT1(cinfo,code,p1)  \
2   ((cinfo)->err->msg_code = (code), \
3    (cinfo)->err->msg_parm.i[0] = (p1), \
4    (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

 

实际应用中遇到了这么个打印“Improper call to JPEG library in state 202”,那么,这句话是怎么打印出来的呢?

1     cinfo.err = jpeg_std_error(&jerr);
2     cinfo.global_state = 202;
3     (&cinfo)->err->msg_code = (JERR_BAD_STATE);
4     (&cinfo)->err->msg_parm.i[0] = ((&cinfo)->global_state);
5     ((*(&cinfo)->err->error_exit)) ((j_common_ptr) (&cinfo));
6 
7     //ERREXIT1(&cinfo, JERR_BAD_STATE, (&cinfo)->global_state);

line3~5是line7的展开式。第5行中的*间接访问操作符可以不用(http://www.cnblogs.com/black-mamba/p/6765231.html)

<jpegint.h>中包含global_state的值:

/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
#define CSTATE_START    100    /* after create_compress */
#define CSTATE_SCANNING    101    /* start_compress done, write_scanlines OK */
#define CSTATE_RAW_OK    102    /* start_compress done, write_raw_data OK */
#define CSTATE_WRCOEFS    103    /* jpeg_write_coefficients done */
#define DSTATE_START    200    /* after create_decompress */
#define DSTATE_INHEADER    201    /* reading header markers, no SOS yet */
#define DSTATE_READY    202    /* found SOS, ready for start_decompress */
#define DSTATE_PRELOAD    203    /* reading multiscan file in start_decompress*/
#define DSTATE_PRESCAN    204    /* performing dummy pass for 2-pass quant */
#define DSTATE_SCANNING    205    /* start_decompress done, read_scanlines OK */
#define DSTATE_RAW_OK    206    /* start_decompress done, read_raw_data OK */
#define DSTATE_BUFIMAGE    207    /* expecting jpeg_start_output */
#define DSTATE_BUFPOST    208    /* looking for SOS/EOI in jpeg_finish_output */
#define DSTATE_RDCOEFS    209    /* reading file in jpeg_read_coefficients */
#define DSTATE_STOPPING    210    /* looking for EOI in jpeg_finish_decompress */

<jerror.c>

该文件中error_exit()->output_message()->format_message()有如此调用关系。

posted @ 2017-04-25 23:27  suonikeyinsu  Views(2442)  Comments(0Edit  收藏  举报