diff options
Diffstat (limited to 'jpegxr/cw_emit.c')
-rw-r--r-- | jpegxr/cw_emit.c | 677 |
1 files changed, 677 insertions, 0 deletions
diff --git a/jpegxr/cw_emit.c b/jpegxr/cw_emit.c new file mode 100644 index 000000000..cda26feed --- /dev/null +++ b/jpegxr/cw_emit.c @@ -0,0 +1,677 @@ + +/************************************************************************* +* +* This software module was originally contributed by Microsoft +* Corporation in the course of development of the +* ITU-T T.832 | ISO/IEC 29199-2 ("JPEG XR") format standard for +* reference purposes and its performance may not have been optimized. +* +* This software module is an implementation of one or more +* tools as specified by the JPEG XR standard. +* +* ITU/ISO/IEC give You a royalty-free, worldwide, non-exclusive +* copyright license to copy, distribute, and make derivative works +* of this software module or modifications thereof for use in +* products claiming conformance to the JPEG XR standard as +* specified by ITU-T T.832 | ISO/IEC 29199-2. +* +* ITU/ISO/IEC give users the same free license to this software +* module or modifications thereof for research purposes and further +* ITU/ISO/IEC standardization. +* +* Those intending to use this software module in products are advised +* that its use may infringe existing patents. ITU/ISO/IEC have no +* liability for use of this software module or modifications thereof. +* +* Copyright is not released for products that do not conform to +* to the JPEG XR standard as specified by ITU-T T.832 | +* ISO/IEC 29199-2. +* +* Microsoft Corporation retains full right to modify and use the code +* for its own purpose, to assign or donate the code to a third party, +* and to inhibit third parties from using the code for products that +* do not conform to the JPEG XR standard as specified by ITU-T T.832 | +* ISO/IEC 29199-2. +* +* This copyright notice must be included in all copies or derivative +* works. +* +* Copyright (c) ITU-T/ISO/IEC 2008, 2009. +***********************************************************************/ + +#ifdef _MSC_VER +#pragma comment (user,"$Id: cw_emit.c,v 1.2 2008/03/02 18:35:27 steve Exp $") +#else +#ident "$Id: cw_emit.c,v 1.2 2008/03/02 18:35:27 steve Exp $" +#endif + +# include "jxr_priv.h" +# include <stdlib.h> +# include <string.h> +# include <assert.h> + +int jxrc_start_file(jxr_container_t cp, FILE*fd) +{ + const unsigned char head_bytes[8] = {0x49, 0x49, 0xbc, 0x01, + 0x08, 0x00, 0x00, 0x00 }; + + assert(cp->fd == 0); + + /* initializations */ + cp->separate_alpha_image_plane = 0; + cp->image_count_mark = 0; + cp->alpha_count_mark = 0; + cp->alpha_offset_mark = 0; + cp->alpha_band = 0; + + cp->fd = fd; + cp->file_mark = ftell(cp->fd); + + fwrite(head_bytes, 1, 8, cp->fd); + return 0; +} + +int jxrc_begin_ifd_entry(jxr_container_t cp) +{ + assert(cp->image_count == 0); + cp->image_count = 1; + return 0; +} + + +int jxrc_set_pixel_format(jxr_container_t cp, jxrc_t_pixelFormat fmt) +{ + memcpy(cp->pixel_format, jxr_guids[fmt], 16); + + return 0; +} + +jxrc_t_pixelFormat jxrc_get_pixel_format(jxr_container_t cp) +{ + unsigned char guid[16]; + int i; + + for(i=0; i< NUM_GUIDS; i++) + { + if(isEqualGUID(cp->pixel_format, jxr_guids[i])) + { + break; + } + } + if(i==NUM_GUIDS) + assert(0); + return (jxrc_t_pixelFormat)i; + +} + + +int jxrc_set_image_shape(jxr_container_t cp, unsigned wid, unsigned hei) +{ + cp->wid = wid; + cp->hei = hei; + return 0; +} + +int jxrc_set_image_band_presence(jxr_container_t cp, unsigned bands) +{ + cp->image_band = (uint8_t) bands; + return 0; +} + +/* +This will induce the encoder to write as many of the +IFD tags of table A.4 (the listing of IFD tags) as it can +Off by default. +#define WRITE_OPTIONAL_IFD_TAGS +*/ + +int jxrc_set_separate_alpha_image_plane(jxr_container_t cp, unsigned int alpha_present) +{ + cp->separate_alpha_image_plane = alpha_present; + return 0; +} + +static void emit_ifd(jxr_container_t cp) +{ + unsigned long ifd_mark; + int idx; + struct ifd_table ifd[64]; + unsigned char buf[1024]; + + int num_ifd = 0; + int num_buf = 0; + unsigned long ifd_len; + unsigned char scr[12]; + +#ifdef WRITE_OPTIONAL_IFD_TAGS + int ifd_cnt; + char * input_string; + + /* various sample strings used to test storage */ + char document_name[] = {"JPEG XR image created by JPEG XR sample encoder."}; + char image_description[] = {"The core codestream begins at WMPHOTO"}; + char equipment_make[] = {"???"}; + char equipment_model[] = {"JXR 0X1"}; + char page_name[]={"Test page name"}; + unsigned short page_number[] = {1,2}; + char software_name_version[]={"JPEG XR reference software v1.6"}; + char date_time[]={"2009:04:01 12:34:56"}; + char artist_name[]={"JPEG Committee"}; + char host_computer[]={"JXR"}; + char copyright_notice[]={"ŠJPEG Committee"}; + unsigned long spatial_xfrm = 0; + unsigned char profile_idc = 111; + unsigned char level_idc = 255; + float width_res = 96.0; + float height_res = 96.0; + + assert(cp->image_count > 0); + if (cp->image_count > 1){ + assert(0); + ifd_mark = 0; + } else { + ifd_mark = 8; + } + + input_string = document_name; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x010d; /* DOCUMENT_NAME */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + input_string = image_description; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x010e; /* IMAGE_DESCRIPTION */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + input_string = equipment_make; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x010f; /* EQUIPMENT_MAKE */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + input_string = equipment_model; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x0110; /* EQUIPMENT_MODEL */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + input_string = page_name; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x011d; /* PAGE_NAME */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + ifd[num_ifd].tag = 0x0129; /* PAGE_NUMBER */ + ifd[num_ifd].type = 3; /* USHORT */ + ifd[num_ifd].cnt = 2; + ifd[num_ifd].value_.v_short[0] = page_number[0]; + ifd[num_ifd].value_.v_short[1] = page_number[1]; + num_ifd += 1; + + input_string = software_name_version; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x0131; /* SOFTWARE_NAME_VERSION */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + input_string = date_time; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x0132; /* DATE_TIME */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + input_string = artist_name; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x013b; /* ARTIST_NAME */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + input_string = host_computer; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x013c; /* HOST_COMPUTER */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + input_string = copyright_notice; + ifd_cnt = strlen(input_string) + 1; + ifd[num_ifd].tag = 0x8298; /* COPYRIGHT_NOTICE */ + ifd[num_ifd].type = 2; /* UTF8 */ + ifd[num_ifd].cnt = ifd_cnt; + if (ifd_cnt > 4) + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + else + memcpy(ifd[num_ifd].value_.v_sbyte, input_string, ifd_cnt); + + for (idx = 0 ; idx < ifd_cnt ; idx += 1) + buf[num_buf++] = input_string[idx]; + if (num_buf & 0x1) + buf[num_buf++] = (unsigned char) 0; + num_ifd += 1; + + ifd[num_ifd].tag = 0xa001; /* COLOR_SPACE */ + ifd[num_ifd].type = 3; /* USHORT */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_short[0] = 0xffff; /* Just use this value for testing */ + ifd[num_ifd].value_.v_short[1] = 0; + num_ifd += 1; +#endif + + ifd[num_ifd].tag = 0xbc01; /* PIXEL_FORMAT */ + ifd[num_ifd].type = 1; /* BYTE */ + ifd[num_ifd].cnt = 16; + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + + for (idx = 0 ; idx < 16 ; idx += 1) + buf[num_buf++] = cp->pixel_format[idx]; + num_ifd += 1; + +#ifdef WRITE_OPTIONAL_IFD_TAGS + ifd[num_ifd].tag = 0xbc02; /* SPATIAL_XFRM_PRIMARY */ + ifd[num_ifd].type = 4; /* ULONG */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_long = spatial_xfrm; + num_ifd += 1; + + /* IMAGE_TYPE should only be present when multiple images are in the image */ + /* Fix this condition if encoder can handle multiple images */ + if (0){ + ifd[num_ifd].tag = 0xbc04; /* IMAGE_TYPE */ + ifd[num_ifd].type = 4; /* ULONG */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_long = 0; + num_ifd += 1; + } + + ifd[num_ifd].tag = 0xbc05; /* PTM_COLOR_INFO() */ + ifd[num_ifd].type = 1; /* BYTE */ + ifd[num_ifd].cnt = 4; + ifd[num_ifd].value_.v_byte[0] = 2; /* default to unspecified */ + ifd[num_ifd].value_.v_byte[1] = 2; /* default to unspecified */ + ifd[num_ifd].value_.v_byte[2] = 2; /* default to no rotation */ + ifd[num_ifd].value_.v_byte[3] = 0; /* default to no rotation */ + num_ifd += 1; + + ifd[num_ifd].tag = 0xbc06; /* PROFILE_LEVEL_CONTAINER() */ + ifd[num_ifd].type = 1; /* BYTE */ + ifd[num_ifd].cnt = 4; + ifd[num_ifd].value_.v_byte[0] = profile_idc; + ifd[num_ifd].value_.v_byte[1] = level_idc; + ifd[num_ifd].value_.v_byte[2] = 0; + ifd[num_ifd].value_.v_byte[3] = 1; + num_ifd += 1; + +#endif + + ifd[num_ifd].tag = 0xbc80; /* IMAGE_WIDTH */ + ifd[num_ifd].type = 4; /* ULONG */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_long = cp->wid; + + num_ifd += 1; + + ifd[num_ifd].tag = 0xbc81; /* IMAGE_HEIGHT */ + ifd[num_ifd].type = 4; /* ULONG */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_long = cp->hei; + + num_ifd += 1; + +#ifdef WRITE_OPTIONAL_IFD_TAGS + ifd[num_ifd].tag = 0xbc82; /* WIDTH_RESOLUTION */ + ifd[num_ifd].type = 11; /* FLOAT */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_float = width_res; + num_ifd += 1; + + ifd[num_ifd].tag = 0xbc83; /* HEIGHT_RESOLUTION */ + ifd[num_ifd].type = 11; /* FLOAT */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_float = height_res; + num_ifd += 1; +#endif + + ifd[num_ifd].tag = 0xbcc0; /* IMAGE_OFFSET */ + ifd[num_ifd].type = 4; /* ULONG */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_long = 0; + + num_ifd += 1; + + ifd[num_ifd].tag = 0xbcc1; /* IMAGE_COUNT */ + ifd[num_ifd].type = 4; /* ULONG */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_long = 0; + + num_ifd += 1; + + if (cp->separate_alpha_image_plane) { + ifd[num_ifd].tag = 0xbcc2; /* ALPHA_OFFSET */ + ifd[num_ifd].type = 4; /* ULONG */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_long = 0; + + num_ifd += 1; + + ifd[num_ifd].tag = 0xbcc3; /* ALPHA_COUNT */ + ifd[num_ifd].type = 4; /* ULONG */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_long = 0; + + num_ifd += 1; + } + +#ifdef WRITE_OPTIONAL_IFD_TAGS + ifd[num_ifd].tag = 0xbcc4; /* IMAGE_BAND_PRESENCE */ + ifd[num_ifd].type = 1; /* BYTE */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_byte[0] = cp->image_band; + num_ifd += 1; + + if (cp->separate_alpha_image_plane) { + ifd[num_ifd].tag = 0xbcc5; /* ALPHA_BAND_PRESENCE */ + ifd[num_ifd].type = 1; /* BYTE */ + ifd[num_ifd].cnt = 1; + ifd[num_ifd].value_.v_byte[0] = cp->alpha_band; + num_ifd += 1; + } + + ifd[num_ifd].tag = 0xea1c; /* PADDING_DATA */ + ifd[num_ifd].type = 7; /* UNDEFINED */ + ifd[num_ifd].cnt = 21; /* Value set arbitrarily to tests this IFD entry */ + ifd[num_ifd].value_.v_long = ifd_mark + num_buf; + + assert(ifd[num_ifd].cnt > 1); + + buf[num_buf++] = 0x1c; + buf[num_buf++] = 0xea; + for (idx = 2 ; idx < ifd[num_ifd].cnt ; idx += 1) + buf[num_buf++] = 0; + num_ifd += 1; +#endif + + ifd_len = 2 + 12*num_ifd + 4; /* NUM_ENTRIES + 12 bytes per entry + ZERO_OR_NEXT_IFD_OFFSET */ + + cp->image_offset_mark = ifd_mark + ifd_len + num_buf; + + for (idx = 0 ; idx < num_ifd ; idx += 1) { + switch (ifd[idx].type) { + case 1: /* BYTE */ + case 2: /* UTF8 */ + case 6: /* SBYTE */ + case 7: /* UNDEFINED */ + if (ifd[idx].cnt > 4) + ifd[idx].value_.v_long += ifd_len; + break; + case 3: /* USHORT */ + case 8: /* SSHORT */ + if (ifd[idx].cnt > 2) + ifd[idx].value_.v_long += ifd_len; + break; + case 4: /* ULONG */ + case 9: /* SLONG */ + case 11: /* FLOAT */ + if (ifd[idx].cnt > 1) + ifd[idx].value_.v_long += ifd_len; + /* If we find the IMAGE_OFFSET, we know its value + now. Write it into v_long */ + if (ifd[idx].tag == 0xbcc0) /* IMAGE_OFFSET */ + ifd[idx].value_.v_long = cp->image_offset_mark; + /* For the following markers, record the locations to be filled in later */ + if (ifd[idx].tag == 0xbcc1) /* IMAGE_COUNT */ + cp->image_count_mark = ifd_mark + 2 + 12*idx + 8; + if (ifd[idx].tag == 0xbcc2) /* ALPHA_OFFSET */ + cp->alpha_offset_mark = ifd_mark + 2 + 12*idx + 8; + if (ifd[idx].tag == 0xbcc3) /* ALPHA_COUNT */ + cp->alpha_count_mark = ifd_mark + 2 + 12*idx + 8; + + break; + case 5: /* URATIONAL */ + case 10: /* SRATIONAL */ + case 12: /* DOUBLE */ + ifd[idx].value_.v_long += ifd_len; + break; + default: /* RESERVED */ + assert(0); + } + } + + scr[0] = (num_ifd>>0) & 0xff; + scr[1] = (num_ifd>>8) & 0xff; + fwrite(scr, 1, 2, cp->fd); + for (idx = 0 ; idx < num_ifd ; idx += 1) { + scr[0] = (ifd[idx].tag >> 0) & 0xff; + scr[1] = (ifd[idx].tag >> 8) & 0xff; + scr[2] = (ifd[idx].type>> 0) & 0xff; + scr[3] = (ifd[idx].type>> 8) & 0xff; + scr[4] = (ifd[idx].cnt >> 0) & 0xff; + scr[5] = (ifd[idx].cnt >> 8) & 0xff; + scr[6] = (ifd[idx].cnt >>16) & 0xff; + scr[7] = (ifd[idx].cnt >>24) & 0xff; + + switch (ifd[idx].type) { + case 1: /* BYTE */ + case 2: /* UTF8 */ + case 6: /* SBYTE */ + case 7: /* UNDEFINED */ + if (ifd[idx].cnt <= 4) { + scr[ 8] = ifd[idx].value_.v_byte[0]; + scr[ 9] = ifd[idx].value_.v_byte[1]; + scr[10] = ifd[idx].value_.v_byte[2]; + scr[11] = ifd[idx].value_.v_byte[3]; + } else { + scr[ 8] = (ifd[idx].value_.v_long >> 0) & 0xff; + scr[ 9] = (ifd[idx].value_.v_long >> 8) & 0xff; + scr[10] = (ifd[idx].value_.v_long >>16) & 0xff; + scr[11] = (ifd[idx].value_.v_long >>24) & 0xff; + } + break; + case 3: /* USHORT */ + case 8: /* SSHORT */ + if (ifd[idx].cnt <= 2) { + scr[ 8] = (ifd[idx].value_.v_short[0] >> 0) & 0xff; + scr[ 9] = (ifd[idx].value_.v_short[0] >> 8) & 0xff; + scr[10] = (ifd[idx].value_.v_short[1] >> 0) & 0xff; + scr[11] = (ifd[idx].value_.v_short[1] >> 8) & 0xff; + } else { + scr[ 8] = (ifd[idx].value_.v_long >> 0) & 0xff; + scr[ 9] = (ifd[idx].value_.v_long >> 8) & 0xff; + scr[10] = (ifd[idx].value_.v_long >>16) & 0xff; + scr[11] = (ifd[idx].value_.v_long >>24) & 0xff; + } + break; + case 4: /* ULONG */ + case 9: /* SLONG */ + case 11: /* FLOAT */ + case 5: /* URATIONAL */ + case 10: /* SRATIONAL */ + case 12: /* DOUBLE */ + scr[ 8] = (ifd[idx].value_.v_long >> 0) & 0xff; + scr[ 9] = (ifd[idx].value_.v_long >> 8) & 0xff; + scr[10] = (ifd[idx].value_.v_long >>16) & 0xff; + scr[11] = (ifd[idx].value_.v_long >>24) & 0xff; + break; + default: + assert(0); + break; + } + fwrite(scr, 1, 12, cp->fd); + } + cp->next_ifd_mark = ftell(cp->fd); + scr[0] = 0; + scr[1] = 0; + scr[2] = 0; + scr[3] = 0; + + fwrite(scr, 1, 4, cp->fd); + + fwrite(buf, 1, num_buf, cp->fd); +} + +int jxrc_begin_image_data(jxr_container_t cp) +{ + emit_ifd(cp); + return 0; +} + +int jxrc_write_container_post(jxr_container_t cp) +{ + uint32_t mark = ftell(cp->fd); + uint32_t count; + unsigned char scr[4]; + + mark = (mark+1)&~1; + + assert(mark > cp->image_offset_mark); + count = mark - cp->image_offset_mark; + + DEBUG("CONTAINER: measured bitstream count=%u\n", count); + + fseek(cp->fd, cp->image_count_mark, SEEK_SET); + + scr[0] = (count >> 0) & 0xff; + scr[1] = (count >> 8) & 0xff; + scr[2] = (count >> 16) & 0xff; + scr[3] = (count >> 24) & 0xff; + fwrite(scr, 1, 4, cp->fd); + + if(cp->separate_alpha_image_plane) + { + fseek(cp->fd, cp->alpha_offset_mark, SEEK_SET); + count = mark; + scr[0] = (count >> 0) & 0xff; + scr[1] = (count >> 8) & 0xff; + scr[2] = (count >> 16) & 0xff; + scr[3] = (count >> 24) & 0xff; + fwrite(scr, 1, 4, cp->fd); + } + fseek(cp->fd, mark, SEEK_SET); + cp->alpha_begin_mark = mark; + return 0; +} + +int jxrc_write_container_post_alpha(jxr_container_t cp) +{ + uint32_t mark = ftell(cp->fd); + uint32_t count; + + mark = (mark+1)&~1; + + count = mark - cp->alpha_begin_mark; + DEBUG("CONTAINER: measured alpha count=%u\n", count); + + if(cp->separate_alpha_image_plane) + { + unsigned char scr[4]; + fseek(cp->fd, cp->alpha_count_mark, SEEK_SET); + count = mark; + scr[0] = (count >> 0) & 0xff; + scr[1] = (count >> 8) & 0xff; + scr[2] = (count >> 16) & 0xff; + scr[3] = (count >> 24) & 0xff; + fwrite(scr, 1, 4, cp->fd); + } + fseek(cp->fd, mark, SEEK_SET); + return 0; +} +/* +* $Log: cw_emit.c,v $ +* Revision 1.2 2009/05/29 12:00:00 microsoft +* Reference Software v1.6 updates. +* +* Revision 1.1 2009/04/13 12:00:00 microsoft +* Reference Software v1.5 updates. +* +*/ + |