void agfa1_offset_makervalue(FILE *inptr,unsigned short byteorder, struct ifd_entry *entry_ptr,unsigned long fileoffset_base, struct image_summary *summary_entry,char *parent_name,char*prefix, int indent,int make,int model,int at_offset) { unsigned long max_offset = 0; unsigned long value_offset; unsigned long dumplength,count; unsigned short marker; char *nameoftag; char *fulldirname = NULL; int status = 0; int chpr = 0; if(entry_ptr) { nameoftag = maker_tagname(entry_ptr->tag,make,model); fulldirname = splice(parent_name,".",nameoftag); value_offset = fileoffset_base + entry_ptr->value; count = entry_ptr->count; switch(entry_ptr->tag) { case 0x0209: /* CameraId */ if(at_offset && (PRINT_VALUE_AT_OFFSET)) { print_tag_address(ENTRY,value_offset,indent,prefix); print_makertagid(entry_ptr,23," = ",make,model); } if((PRINT_VALUE)) print_ascii(inptr,entry_ptr->count,value_offset); break; case 0x0100: /* Jpeg Thumbnail */ if(at_offset && (PRINT_SECTION)) { print_tag_address(VALUE_AT_OFFSET,value_offset,indent,prefix); chpr += printf("# Start of JPEG Thumbnail from MakerNote"); chpr += printf(" length %ld",count); } else if(!at_offset && (PRINT_VALUE)) { if(!(PRINT_OFFSET)) chpr += printf("@%lu",value_offset); else chpr = printf("length %lu",count); } if((PRINT_SECTION) || (PRINT_SEGMENT)) chpr = newline(chpr); marker = read_ushort(inptr,TIFF_MOTOROLA,value_offset); max_offset = process_jpeg_segments(inptr,value_offset,marker, count,summary_entry,fulldirname, prefix,indent+SMALLINDENT); if(at_offset) { if((PRINT_SECTION)) { if((status = jpeg_status(0) == JPEG_EARLY_EOI)) chpr = newline(chpr); jpeg_status(status); print_tag_address(VALUE_AT_OFFSET,value_offset + count - 1, indent,"-"); chpr += printf("# End of JPEG Thumbnail from MakerNote"); if((PRINT_ENTRY) && !(PRINT_VALUE)) chpr = newline(chpr); } } print_jpeg_status(); if(marker && summary_entry) { /* The new one is on the end of the chain */ if((summary_entry = last_summary_entry(summary_entry))) { summary_entry->filesubformat |= FILESUBFMT_MNOTE; summary_entry->datatype = MAKER_IFD; summary_entry->subfiletype = THUMBNAIL_TYPE; } } /* make certain we're at the end */ clearerr(inptr); fseek(inptr,value_offset + count,SEEK_SET); break; case 0x0f00: /* Data */ if(at_offset && (PRINT_ENTRY)) { print_tag_address(ENTRY,value_offset,indent,prefix); print_makertagid(entry_ptr,MAKERTAGWIDTH," : ",make,model); chpr += printf(" length %-9lu", count); if(Max_undefined == 0) { if(chpr) printred(" (not dumped, use -U)"); } else { if((Max_undefined == DUMPALL) || (Max_undefined > count)) dumplength = count; else dumplength = Max_undefined; chpr = newline(chpr); hexdump(inptr,value_offset,count,dumplength,12, indent,SUBINDENT); chpr = newline(1); } } else if(!at_offset && (PRINT_VALUE)) { if(!(PRINT_OFFSET)) chpr += printf("@%lu:%lu",value_offset,entry_ptr->count); else chpr = printf("length %lu", entry_ptr->count); if(!(PRINT_VALUE_AT_OFFSET)) chpr += printf(" # UNDEFINED"); } /* make certain we're at the end */ fseek(inptr,value_offset + count,SEEK_SET); break; default: print_generic_offset_makervalue(inptr,byteorder,entry_ptr, fileoffset_base,fulldirname,prefix,indent, make,model,at_offset); break; } if(fulldirname) free(fulldirname); } setcharsprinted(chpr); }
void asahi2_offset_makervalue(FILE *inptr,unsigned short byteorder, struct ifd_entry *entry_ptr,unsigned long fileoffset_base, struct image_summary *summary_entry,char *parent_name, char *prefix,int indent,int make,int model,int at_offset) { static unsigned long jpegthumbnaillength = 0UL; unsigned long value_offset,max_offset; unsigned short marker; unsigned long count; char *nameoftag; char *fulldirname = CNULL; int status = 0; int chpr = 0; if(inptr && entry_ptr) { nameoftag = maker_tagname(entry_ptr->tag,make,model); fulldirname = splice(parent_name,".",nameoftag); value_offset = fileoffset_base + entry_ptr->value; count = entry_ptr->count; switch(entry_ptr->tag) { case 0x0003: /* JpegThumbnailLength */ /* Just record it */ jpegthumbnaillength = entry_ptr->value; break; case 0x0004: /* JpegThumbnailOffset */ if(jpegthumbnaillength) { count = jpegthumbnaillength; jpegthumbnaillength = 0; } if(at_offset && (PRINT_SECTION)) { print_tag_address(VALUE_AT_OFFSET,value_offset,indent,prefix); chpr += printf("# Start of JPEG Thumbnail from MakerNote"); chpr += printf(" length %ld",count); } else if(!at_offset && (PRINT_VALUE)) { if(!(PRINT_OFFSET)) chpr += printf("@%lu:%lu",value_offset,count); else chpr = printf("length %lu",count); } if((PRINT_SECTION) || (PRINT_SEGMENT)) chpr = newline(chpr); marker = read_ushort(inptr,TIFF_MOTOROLA,value_offset); max_offset = process_jpeg_segments(inptr,value_offset,marker, count,summary_entry,fulldirname, prefix,indent+SMALLINDENT); if(at_offset) { if((PRINT_SECTION)) { if((status = jpeg_status(0) == JPEG_EARLY_EOI)) chpr = newline(chpr); jpeg_status(status); print_tag_address(VALUE_AT_OFFSET,value_offset + count - 1, indent,"-"); chpr += printf("# End of JPEG Thumbnail from MakerNote"); if((PRINT_ENTRY) && !(PRINT_VALUE)) chpr = newline(chpr); } } print_jpeg_status(); if(marker && summary_entry) { /* The new one is on the end of the chain */ if((summary_entry = last_summary_entry(summary_entry))) { summary_entry->filesubformat |= FILESUBFMT_MNOTE; summary_entry->datatype = MAKER_IFD; summary_entry->subfiletype = THUMBNAIL_TYPE; } } /* make certain we're at the end */ clearerr(inptr); fseek(inptr,value_offset + count,SEEK_SET); break; case 0x0e00: /* PrintIM (Epson Print Image matching) */ if(!at_offset && (PRINT_VALUE)) { if(!(PRINT_OFFSET)) chpr += printf("@%lu",value_offset); } process_pim(inptr,byteorder,entry_ptr->value,fileoffset_base, count,nameoftag,parent_name,prefix,indent); break; default: print_generic_offset_makervalue(inptr,byteorder,entry_ptr, fileoffset_base, fulldirname,prefix,indent, make,model,at_offset); break; } } setcharsprinted(chpr); }