// Parse decodes all Canon makernote data found in x and adds it to x. func (_ *canon) Parse(x *exif.Exif) error { m, err := x.Get(exif.MakerNote) if err != nil { return nil } mk, err := x.Get(exif.Make) if err != nil { return nil } if val, err := mk.StringVal(); err != nil || val != "Canon" { return nil } // Canon notes are a single IFD directory with no header. // Reader offsets need to be w.r.t. the original tiff structure. buf := bytes.NewReader(append(make([]byte, m.ValOffset), m.Val...)) buf.Seek(int64(m.ValOffset), 0) mkNotesDir, _, err := tiff.DecodeDir(buf, x.Tiff.Order) if err != nil { return err } x.LoadTags(mkNotesDir, makerNoteCanonFields, false) return nil }
func loadSubDir(x *Exif, ptr FieldName, fieldMap map[uint16]FieldName) error { r := bytes.NewReader(x.Raw) tag, err := x.Get(ptr) if err != nil { return nil } offset := tag.Int(0) _, err = r.Seek(offset, 0) if err != nil { return errors.New("exif: seek to sub-IFD failed: " + err.Error()) } subDir, _, err := tiff.DecodeDir(r, x.Tiff.Order) if err != nil { return errors.New("exif: sub-IFD decode failed: " + err.Error()) } x.LoadTags(subDir, fieldMap, false) return nil }
func (x *Exif) loadSubDir(r *bytes.Reader, ptrName FieldName, fieldMap map[uint16]FieldName) error { tag, ok := x.main[ptrName] if !ok { return nil } offset := tag.Int(0) _, err := r.Seek(offset, 0) if err != nil { return errors.New("exif: seek to sub-IFD failed: " + err.Error()) } subDir, _, err := tiff.DecodeDir(r, x.tif.Order) if err != nil { return errors.New("exif: sub-IFD decode failed: " + err.Error()) } for _, tag := range subDir.Tags { name := fieldMap[tag.Id] x.main[name] = tag } return nil }