From c93f37a85d06e9460ecd3989387ae6cfcc94cdb5 Mon Sep 17 00:00:00 2001
From: Dustin Oprea <myselfasunder@gmail.com>
Date: Thu, 24 May 2018 15:27:45 -0400
Subject: [PATCH] ifd_enumerate: Now parse and expose thumbnail.

---
 assets/NDM_8901.jpg.thumbnail | Bin 0 -> 21491 bytes
 ifd_enumerate.go              | 102 ++++++++++++++++++++++++++++++----
 ifd_enumerate_test.go         |  32 +++++++++++
 tags.go                       |   3 +
 4 files changed, 126 insertions(+), 11 deletions(-)
 create mode 100755 assets/NDM_8901.jpg.thumbnail

diff --git a/assets/NDM_8901.jpg.thumbnail b/assets/NDM_8901.jpg.thumbnail
new file mode 100755
index 0000000000000000000000000000000000000000..e82002b4335990e7e1c7b680c70c0b30892ef8a0
GIT binary patch
literal 21491
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
QQAtsD^aVzgY@-wZ*}9U}3jhEB

literal 0
HcmV?d00001

diff --git a/ifd_enumerate.go b/ifd_enumerate.go
index 65eb19c..05c9c25 100644
--- a/ifd_enumerate.go
+++ b/ifd_enumerate.go
@@ -4,6 +4,7 @@ import (
     "bytes"
     "fmt"
     "strings"
+    "errors"
 
     "encoding/binary"
 
@@ -12,6 +13,8 @@ import (
 
 var (
     ifdEnumerateLogger = log.NewLogger("exifjpeg.ifd")
+
+    ErrNoThumbnail = errors.New("no thumbnail")
 )
 
 
@@ -293,6 +296,8 @@ type Ifd struct {
     Children []*Ifd
     NextIfdOffset uint32
     NextIfd *Ifd
+
+    thumbnailData []byte
 }
 
 func (ifd *Ifd) TagValue(ite *IfdTagEntry) (value interface{}, err error) {
@@ -323,7 +328,7 @@ func (ifd *Ifd) TagValueBytes(ite *IfdTagEntry) (value []byte, err error) {
 
 // FindTagWithId returns a list of tags (usually just zero or one) that match
 // the given tag ID. This is efficient.
-func (ifd Ifd) FindTagWithId(tagId uint16) (results []*IfdTagEntry, err error) {
+func (ifd *Ifd) FindTagWithId(tagId uint16) (results []*IfdTagEntry, err error) {
     defer func() {
         if state := recover(); state != nil {
             err = log.Wrap(state.(error))
@@ -340,7 +345,7 @@ func (ifd Ifd) FindTagWithId(tagId uint16) (results []*IfdTagEntry, err error) {
 
 // FindTagWithName returns a list of tags (usually just zero or one) that match
 // the given tag name. This is not efficient (though the labor is trivial).
-func (ifd Ifd) FindTagWithName(tagName string) (results []*IfdTagEntry, err error) {
+func (ifd *Ifd) FindTagWithName(tagName string) (results []*IfdTagEntry, err error) {
     defer func() {
         if state := recover(); state != nil {
             err = log.Wrap(state.(error))
@@ -380,11 +385,83 @@ func (ifd Ifd) String() string {
     return fmt.Sprintf("Ifd<ID=(%d) PARENT-IFD=[%s] IFD=[%s] IDX=(%d) COUNT=(%d) OFF=(0x%04x) CHILDREN=(%d) PARENT=(0x%04x) NEXT-IFD=(0x%04x)", ifd.Id, ifd.Ii.ParentIfdName, ifd.Ii.IfdName, ifd.Index, len(ifd.Entries), ifd.Offset, len(ifd.Children), parentOffset, ifd.NextIfdOffset)
 }
 
-func (ifd Ifd) Identity() IfdIdentity {
+func (ifd *Ifd) parseThumbnail() (err error) {
+    defer func() {
+        if state := recover(); state != nil {
+            err = log.Wrap(state.(error))
+        }
+    }()
+
+    results, err := ifd.FindTagWithId(ThumbnailOffsetTagId)
+    if err != nil {
+        if log.Is(err, ErrTagNotFound) == true {
+            return nil
+        } else {
+            log.Panic(err)
+        }
+    }
+
+    offsetIte := results[0]
+
+    vRaw, err := ifd.TagValue(offsetIte)
+    log.PanicIf(err)
+
+    vList := vRaw.([]uint32)
+    if len(vList) != 1 {
+        log.Panicf("not exactly one long: (%d)", len(vList))
+    }
+
+    offset := vList[0]
+
+    results, err = ifd.FindTagWithId(ThumbnailSizeTagId)
+    if err != nil {
+        if log.Is(err, ErrTagNotFound) == true {
+            log.Panic(ErrNoThumbnail)
+        } else {
+            log.Panic(err)
+        }
+    }
+
+    lengthIte := results[0]
+
+    vRaw, err = ifd.TagValue(lengthIte)
+    log.PanicIf(err)
+
+    vList = vRaw.([]uint32)
+    if len(vList) != 1 {
+        log.Panicf("not exactly one long: (%d)", len(vList))
+    }
+
+    length := vList[0]
+
+    if len(ifd.addressableData) < int(offset) + int(length) {
+        log.Panicf("thumbnail size not valid: (%d) > (%d)", length, len(ifd.addressableData) - int(offset))
+    }
+
+    ifd.thumbnailData = ifd.addressableData[offset:offset + length]
+
+    return nil
+}
+
+func (ifd *Ifd) Thumbnail() (data []byte, err error) {
+    defer func() {
+        if state := recover(); state != nil {
+            err = log.Wrap(state.(error))
+        }
+    }()
+
+    if ifd.thumbnailData == nil {
+        log.Panic(ErrNoThumbnail)
+    }
+
+    return ifd.thumbnailData, nil
+}
+
+func (ifd *Ifd) Identity() IfdIdentity {
     return ifd.Ii
 }
 
-func (ifd Ifd) dumpTags(tags []*IfdTagEntry) []*IfdTagEntry {
+func (ifd *Ifd) dumpTags(tags []*IfdTagEntry) []*IfdTagEntry {
     if tags == nil {
         tags = make([]*IfdTagEntry, 0)
     }
@@ -427,11 +504,11 @@ func (ifd Ifd) dumpTags(tags []*IfdTagEntry) []*IfdTagEntry {
 }
 
 // DumpTags prints the IFD hierarchy.
-func (ifd Ifd) DumpTags() []*IfdTagEntry {
+func (ifd *Ifd) DumpTags() []*IfdTagEntry {
     return ifd.dumpTags(nil)
 }
 
-func (ifd Ifd) printTagTree(index, level int, nextLink bool) {
+func (ifd *Ifd) printTagTree(index, level int, nextLink bool) {
     indent := strings.Repeat(" ", level * 2)
 
     prefix := " "
@@ -489,11 +566,11 @@ func (ifd Ifd) printTagTree(index, level int, nextLink bool) {
 }
 
 // PrintTagTree prints the IFD hierarchy.
-func (ifd Ifd) PrintTagTree() {
+func (ifd *Ifd) PrintTagTree() {
     ifd.printTagTree(0, 0, false)
 }
 
-func (ifd Ifd) printIfdTree(level int, nextLink bool) {
+func (ifd *Ifd) printIfdTree(level int, nextLink bool) {
     indent := strings.Repeat(" ", level * 2)
 
     prefix := " "
@@ -537,11 +614,11 @@ func (ifd Ifd) printIfdTree(level int, nextLink bool) {
 }
 
 // PrintIfdTree prints the IFD hierarchy.
-func (ifd Ifd) PrintIfdTree() {
+func (ifd *Ifd) PrintIfdTree() {
     ifd.printIfdTree(0, false)
 }
 
-func (ifd Ifd) dumpTree(tagsDump []string, level int) []string {
+func (ifd *Ifd) dumpTree(tagsDump []string, level int) []string {
     if tagsDump == nil {
         tagsDump = make([]string, 0)
     }
@@ -599,7 +676,7 @@ func (ifd Ifd) dumpTree(tagsDump []string, level int) []string {
 }
 
 // DumpTree returns a list of strings describing the IFD hierarchy.
-func (ifd Ifd) DumpTree() []string {
+func (ifd *Ifd) DumpTree() []string {
     return ifd.dumpTree(nil, 0)
 }
 
@@ -691,6 +768,9 @@ func (ie *IfdEnumerate) Collect(rootIfdOffset uint32) (index IfdIndex, err error
             NextIfdOffset: nextIfdOffset,
         }
 
+        err = ifd.parseThumbnail()
+        log.PanicIf(err)
+
         // Add ourselves to a big list of IFDs.
         ifds = append(ifds, &ifd)
 
diff --git a/ifd_enumerate_test.go b/ifd_enumerate_test.go
index 0df85c9..79ad734 100644
--- a/ifd_enumerate_test.go
+++ b/ifd_enumerate_test.go
@@ -6,6 +6,7 @@ import (
     "bytes"
 
     "encoding/binary"
+    "io/ioutil"
 
     "github.com/dsoprea/go-logging"
 )
@@ -277,3 +278,34 @@ func Test_Ifd_FindTagWithName_NonStandard(t *testing.T) {
         log.Panic(err)
     }
 }
+
+func Test_Ifd_Thumbnail(t *testing.T) {
+    filepath := path.Join(assetsPath, "NDM_8901.jpg")
+
+    e := NewExif()
+
+    rawExif, err := e.SearchAndExtractExif(filepath)
+    log.PanicIf(err)
+
+    _, index, err := e.Collect(rawExif)
+    log.PanicIf(err)
+
+    ifd := index.RootIfd
+
+    if ifd.NextIfd == nil {
+        t.Fatalf("There is no IFD1.")
+    }
+
+    // The thumbnail is in IFD1 (The second root IFD).
+    actual, err := ifd.NextIfd.Thumbnail()
+    log.PanicIf(err)
+
+    expectedFilepath := path.Join(assetsPath, "NDM_8901.jpg.thumbnail")
+
+    expected, err := ioutil.ReadFile(expectedFilepath)
+    log.PanicIf(err)
+
+    if bytes.Compare(actual, expected) != 0 {
+        t.Fatalf("thumbnail not correct")
+    }
+}
diff --git a/tags.go b/tags.go
index 50538eb..5e5e449 100644
--- a/tags.go
+++ b/tags.go
@@ -19,6 +19,9 @@ const (
     IfdExifId = 0x8769
     IfdGpsId = 0x8825
     IfdIopId = 0xA005
+
+    ThumbnailOffsetTagId = 0x0201
+    ThumbnailSizeTagId = 0x0202
 )
 
 var (