Commit Graph

130 Commits (208788de28150f1ceba5fbfa2f3fc5f191ac3258)

Author SHA1 Message Date
Dustin Oprea 13045756c5 go.mod: Bump go-logging
- Bring in Is() changes.
2020-05-17 19:36:03 -04:00
Dustin Oprea c9be4b30b0 tags.go: TagIndex now supports multiple types for a single tag
Apparently PixelXDimension and PixelYDimension can official be a SHORT
*or* a LONG, and, now that we're skipping anything that doesn't agree
with the index, it broke some tests.
2020-05-17 04:05:29 -04:00
Dustin Oprea 3310e4b8c8 ifd_enumerate.go: Skip tags that have a divergent type
This also mitigates the processing of duplicate tags (which should never
occur) if the duplicate tags also happen to have unexpected types (our
current scenario).

2020/05/17 02:26:37 exif.ifd_enumerate: [DEBUG]  IFD [IFD/GPSInfo] tag-count: (10)
2020/05/17 02:26:37 exif.ifd_enumerate: [WARNING]  Skipping tag [IFD/GPSInfo] (0x0005) [GPSAltitudeRef] with an unexpected type: (5) [RATIONAL] != (1) [BYTE]
2020/05/17 02:26:37 exif.ifd_enumerate: [WARNING]  Skipping tag [IFD/GPSInfo] (0x001b) [GPSProcessingMethod] with an unexpected type: (2) [ASCII] != (7) [UNDEFINED]
2020/05/17 02:26:37 exif.ifd_enumerate: [DEBUG]  Next IFD at offset: (00000000)

Fixes #37
2020-05-17 02:29:36 -04:00
Dustin Oprea e1b21b5186 tags.go: (TagIndex).Get() now returns ErrTagNotFound rather than panics
This is a managed error scenario.

- Added missing comments.
2020-05-17 02:28:17 -04:00
Dustin Oprea 998844ba08 ifd_enumerate.go: PrintTagTree now skips the thumbnail tags
It prints a lot of noise when this does actually relate to saving the
thumbnail image.
2020-05-17 01:28:11 -04:00
Dustin Oprea 7f6eb3d9f3 utility.go: Add formatted values to ExifTag 2020-05-16 17:31:02 -04:00
Dustin Oprea 220964731d ifd_enumerate.go: Bugfix for ITEs not representing fully-qualified IFD paths
- This resulted in the lookup table having unique entries, and therefore
  no longer needing its values to be slices. We are going to fix this.
  It is not a backwards-compatible change, but this is a fairly internal
  internal functionality.

- Add simple accessors to determine if a thumbnail offset or size.
2020-05-16 17:18:57 -04:00
Dustin Oprea efa6e2d6c0 ifd_builder_test.go: Fix test 2020-05-16 16:47:03 -04:00
Dustin Oprea a45cc7cfd5 exif-read-tool/main.go: Example tool can now dump the thumbnail 2020-05-16 08:21:16 -04:00
Dustin Oprea 71e87d5e22 ifd_enumerate.go:
- Invalid tag-type sets the tag-ID so that we can include it in the log.
- Other logging enhancements.
  - Removed newline

- Incorporate the thumbnail into the furthest-offset counter.
- Thumbnail() no longer panics ErrNoThumbnail and just returns it.
  - This is a managed error, not a true panic condition.

- Collect() now builds index with FQ IFD paths, not non-FQ.
2020-05-16 08:21:12 -04:00
Dustin Oprea 70b6dc8a1a utility.go: Bugfix for non-FQ IFD-paths in GetFlatExifData 2020-05-16 07:54:40 -04:00
Dustin Oprea 42546383ce ifd_enumerate.go: Bugfix for slice error when processing thumbnails
We were not qualifying our thumbnail tag checks with the IFD that
thumbnails are supposed to live in, and were trying to parse the tags
that happen to share the same tag-IDs as thumbnails.

Fixes #dsoprea/go-jpeg-image-structure/issues/10
2020-05-16 07:32:13 -04:00
Dustin Oprea 5e5d4dcef0 ifd_builder_test.go: Fix inaccurate error message 2020-05-16 06:43:09 -04:00
Dustin Oprea 95ec440155 ifd_enumerate.go: Bugfix for scan() fully-qualified IFD paths not being fully-qualified 2020-05-16 06:42:42 -04:00
Dustin Oprea 86f0767752 ifd.go: Drop old commented IfdIdentity type 2020-05-16 06:38:39 -04:00
Dustin Oprea f50c93b99c common: Rename exif.go to ifd.go 2020-05-16 05:24:33 -04:00
Dustin Oprea 9bcc8a45c4 Provide EXIF blob size estimates
We now keep track of the further offset that we have accessed (though
not necessarily the furthest offset of data that is unparseable by us).

It sometimes supports debugging efforts to have a ballpark idea of how
much EXIF data there is, rather than just "from the signature to the
end of the file" or however big the EXIF container is in the enclosing
image format. The latter can be buggy or ambiguous.
2020-05-16 03:19:52 -04:00
Dustin Oprea 416fd86ecd ifd_enumerate.go: Rename IfdTagEnumerator to byteParser
It's more accurate, and no longer exported.
2020-05-16 02:51:36 -04:00
Dustin Oprea 5fdad87477 exif-read-tool/main.go: Log size of EXIF blob
Remember that this is typically from the EXIF signature to the end of
the file.
2020-05-16 01:46:26 -04:00
Dustin Oprea 687250767b ifd_enumerate.go: Drop spurious struct field. Put hex prefix on offset in logging. 2020-05-16 01:45:36 -04:00
Dustin Oprea 3ed898edc8 exif.go: Log offset in SearchAndExtractExifWithReader() 2020-05-16 01:44:15 -04:00
Dustin Oprea 5c21ae7376 ifd_enumerate.go: Enrich unknown-type error with type number 2020-05-16 01:03:31 -04:00
Dustin Oprea 9ce7f5d058 ifd_enumerate.go: Fix log subject 2020-05-16 00:52:14 -04:00
Dustin Oprea e7aea1340c ifd_enumerate.go: Tweak log message 2020-05-06 04:59:28 -04:00
Dustin Oprea 86feeb2b50 ifd_enumerate.go: Log and quietly stop parsing if IFD offset is invalid
Fixes #36
2020-05-06 04:56:05 -04:00
Dustin Oprea 8da3881353 Fix GPS 2.0.0.0 test image name 2020-05-06 01:47:03 -04:00
Dustin Oprea 6303a275e5 ifd_enumerate.go: Enable support for GPS 2.0.0.0
Fixes #35
2020-05-06 01:42:22 -04:00
Dustin Oprea c74ff0d0b0 utility.go: Add GpsDegreesEquals 2020-05-06 01:32:01 -04:00
Dustin Oprea b1ff77dba9 ifd_enumerate.go: Drop TODO 2020-05-05 19:51:12 -04:00
Dustin Oprea b6593b4cec ifd_builder_test.go: Fix name of example 2020-05-05 11:09:19 -04:00
Dustin Oprea bbd4b5fb6f ifd_builder_test.go: Add test and example for updating GPS info
- Added helper for getting GPS test-image.
2020-05-05 03:24:01 -04:00
Dustin Oprea f67048a6e3 Rename package documentation file 2020-05-05 02:46:14 -04:00
Dustin Oprea 36f5ad93e8 gps.go: Add Raw() method to GpsInfo to assisting with writing
- Moved some GPS logic from ifd_enumerate.go to gps.go .
- Added missing comments.
2020-05-05 02:28:56 -04:00
Dustin Oprea f86f12408b exif.go: Update funky recover clauses 2020-05-05 02:27:31 -04:00
Dustin Oprea 4fc876786f exif.go: Brute-force EXIF searching is now buffered
- Added `SearchAndExtractExifWithReader()`.
- `SearchFileAndExtractExif()` now calls `SearchAndExtractExifWithReader()`
  instead of reading the whole image first.

Fixes #34

Relates to optimizations in df264b3 as well.
2020-05-05 01:27:20 -04:00
Dustin Oprea df264b321a exif.go: Use simple byte comparison to match signature 2020-05-05 00:58:01 -04:00
Dustin Oprea cc316fb440 ifd_enumerate.go: (*Ifd).PrintTagTree() no longer fails on parseable undefined values
https://github.com/dsoprea/go-exif/issues/33
2020-05-02 17:11:50 -04:00
Dustin Oprea 6aea10b45f exif-read-tool: Skip unparseable undefined tags
We've encountered a malformed user-comments value in an image from a
Canon EOS 5D Mark II.

2020/05/02 16:28:58 exifjpeg.ifd: [DEBUG]  Parsing IFD [IFD/Exif] (0) at offset (0102).
2020/05/02 16:28:58 exifjpeg.ifd: [DEBUG]  Current IFD tag-count: (33)
2020/05/02 16:28:58 main.main: [WARNING]  Skipping unparseable undefined tag: [IFD/Exif] (9286)
2020/05/02 16:28:58 exifjpeg.ifd: [DEBUG]  Descending to IFD [IFD/Exif/Iop].
2020/05/02 16:28:58 exifjpeg.ifd: [DEBUG]  Parsing IFD [IFD/Exif/Iop] (0) at offset (a164).

Fixes #33
2020-05-02 16:33:40 -04:00
Dustin Oprea 76619923f4 exif-read-tool: Fix verbosity. Replace prints with logging.
It's just an example tool, but still.
2020-05-02 16:25:36 -04:00
Dustin Oprea 80e3b12b98 undefined/exif_9286_user_comment.go: Validate for minimum user-notes size 2020-05-02 16:24:00 -04:00
Dustin Oprea 45986dbda3 Now a specific error for unparseable undefined tags 2020-05-02 16:23:19 -04:00
Dustin Oprea 73303ea590 go.mod: Bump version of go-logging 2020-05-02 16:21:52 -04:00
Dustin Oprea 640175a69f exif-read-tool: Skip unsupported undefined tags 2020-03-21 18:53:14 -04:00
Dustin Oprea 1e1e1ed104 exif-read-tool: Make no-exif error nicer for tool 2020-03-21 18:52:41 -04:00
Dustin Oprea bd04addaf4 v2/common/parser.go: Revert to previous NUL forgiveness
It turns out that there is so much loose handling with the terminating
NUL characters out there that there's a societal breakdown without this.

Fixes #31
2020-01-26 00:26:15 -05:00
Dustin Oprea 0bbb7a3584 ifd_enumerate.go: Revert to using a simple function for the visitor 2020-01-13 18:12:07 -05:00
Dustin Oprea 90b66e3d11 Renamed V2 constant
From ErrUnhandledUnknownTypedTag to ErrUnhandledUndefinedTypedTag. The
release just happened. There should be minimal fallout.
2020-01-13 13:44:00 -05:00
Dustin Oprea b7b73dfdaf Yanked go-exif from our own dependencies
Not sure how that got there.
2020-01-13 12:04:04 -05:00
Dustin Oprea eee9ff13c7 Removed init()'s from tests so they don't run when imported
Otherwise they'll break for other projects' tests. We now initialize our
paths on-demand, which will only happen when running from our own tests.
2020-01-13 12:00:23 -05:00
Dustin Oprea 106cad7062 Add tests for remaining undefined types
- Also fixed a typeo in several recopied error messages.
2020-01-12 18:56:35 -05:00
Dustin Oprea ebd20ffc59 Do not include v1/legacy in coverage 2020-01-12 18:56:35 -05:00
Dustin Oprea 25524615d1 Fix for type-embedded strings not being encoded to JSON correctly in earlier Go's 2020-01-12 18:56:35 -05:00
Dustin Oprea 3b18b2295e common/testing_common.go: Tighten error checking for module-find 2020-01-12 18:56:35 -05:00
Dustin Oprea db9a0b3a24 common/testing_common.go: Add verbosity for module-path find failure 2020-01-12 18:56:35 -05:00
Dustin Oprea 817d4b2856 Fix module resolution with subpackages
exif-read-tool/main_test.go: Fix test broken by moving to V2.
2020-01-12 18:56:35 -05:00
Dustin Oprea 41fd3ae870 undefined: Add five test suites 2020-01-12 18:56:35 -05:00
Dustin Oprea a52d1de840 undefined: Add three suites of tests 2020-01-12 18:56:35 -05:00
Dustin Oprea 4fd78f1397 README.md: Tweaked comment regarding undefined-value 0xa40b 2020-01-12 18:56:35 -05:00
Dustin Oprea 74208315f8 ifd_tag_entry.go: Embellished ChildFqIfdPath comment 2020-01-12 18:56:35 -05:00
Dustin Oprea 307a31d82b exif-read-tool: Upgraded to v2 module 2020-01-12 18:56:35 -05:00
Dustin Oprea fa4e784620 ifd_tag_entry.go: Renamed unexported getter to be nicer 2020-01-12 18:56:35 -05:00
Dustin Oprea 7d26e69f8d Add tested for undefined-tag types 2020-01-12 18:56:35 -05:00
Dustin Oprea f72daedddc ifd_enumerate.go: Ifd no longer needs addressableBytes field 2020-01-12 18:56:35 -05:00
Dustin Oprea 556a15dbee ifd_tag_entry.go: Minor change to use own field directly 2020-01-12 18:56:35 -05:00
Dustin Oprea 1a430b7457 ifd_enumerate.go: Drop `(*Ifd).Value` and `.FormatValue()`
This can and should be done directly on the ITEs themselves.
2020-01-12 18:56:35 -05:00
Dustin Oprea 0c670ca7c2 ifd_tag_entry.go: Renamed RawBytes() to GetRawBytes()
It used to be a simple getter but now it does stuff.
2020-01-12 18:56:35 -05:00
Dustin Oprea 173d686dd9 Visit interface now just gets the ITE struct
That, rather than just a couple of values from it. Primarily because we
want to not have callers involve themselves with the value context
unless they want to.

- ifd_tag_entry.go: ITEs now provide `Format()` and `FormatFirst()`
  methods.

- We dumped several spots of code that could just reuse functions to
  format, decode, or get raw bytes rather than dealing with undefined
  vs not undefined logic themselves.

  - This is now possible due to prior change.

- ifd_tag_entry.go: No longer exports GetValueContext(). Users shouldn't
  usually have to touch it, now.

- Added some commenting.

This commit almost represents everything we have been trying to achieve,
now made possible by the last several commits.
2020-01-12 18:56:35 -05:00
Dustin Oprea 1bdfa9b10e Empower ITEs to resolve values and raw bytes directly
They'll also now embed all of the information they need to know since it
is all known where the ITEs are created. This prevents the user from
having to be involved in it. This makes it much more straightforward and
enjoyable to use.

- ifd_tag_entry.go
  - newIfdTagEntry now takes and embeds `addressableBytes` and
    `byteOrder`.
  - We've dumped the `value` member that let the caller preload a parsed
    value (or bytes?). It's no longer necessary since this led to
    inconsistencies and the ITE can produce these values directly, now.
  - `Value()` obviously no longer takes `addressableValue` and
    `byteOrder` since now embedded.
  - `Value()` will now see and return ErrUnhandledUnknownTypedTag
    directly (not wrapping it, since this is a handled case).

- common/type.go: FormatFromType now uses Stringer as a fallback if
  possible. All undefined-tag wrapper types implement it, so the same
  function can handle both undefined and non-undefined values, and the
  individual types can control the strings presented in simple listing.

- Dropped "resolveValue" parameters from all of the collect, visit, and
  parsing functions. Resolution is now a later step performed by the
  caller on the ITEs, directly.

  - This parameter was protection against undefined-type values
    disrupting simple enumeration, but now the user can simply produce
    the list of tags and can either choose to decode their value or not,
    directly. If they do, they, as of earlier, recent commits, also have
    the ability to properly manage unhandled undefined-values so they
    don't crash.

- The ITEs can now create ValueContext structs directly
  (GetValueContext()), though it might not be necessary now that the
  ITEs can produce the values and encodings directly.

  - This also allowed us to dump several other GetValueContext()
    implementations elsewhere since it is now self-reliant on this type
    and those methods were essentially kludges for the lack of this.

- Dump a bunch of "Value" methods from ITEs which just weren't useful or
  simple enough. Replaced by the above.

- Fixed `(Ifd).String()` to have a pointer receiver.
2020-01-12 18:56:35 -05:00
Dustin Oprea e7e1e89ffb undefined/accessor.go: Drop unnecessary parameters from Decode() 2020-01-12 18:56:35 -05:00
Dustin Oprea 6554f89879 common/type.go: Rename Format() to FormatFromBytes() 2020-01-12 18:56:35 -05:00
Dustin Oprea 82afccee6b Removed concept of ITEVRs
This was from a time long past, from the beginning of the project, and
was just an ineffective bandaid that made things complicated.
2020-01-12 18:56:35 -05:00
Dustin Oprea 9441507683 common/parser.go: An ASCII string not being terminated with NUL now panics
This likely means an offset error or something else that's very bad. We
shouldn't be forgiving it.
2020-01-12 18:56:35 -05:00
Dustin Oprea 351f1b7549 undefined/type.go: Formalized requirement for undefined-types being Stringers 2020-01-12 18:56:35 -05:00
Dustin Oprea 9a4bd45d39 undefined/type.go: Drop TagUndefinedType_UnknownValue
Not used anywhere
2020-01-12 18:56:35 -05:00
Dustin Oprea d293fcac9c undefined/exif_8828_oecf.go: Add Encode() 2020-01-12 18:56:35 -05:00
Dustin Oprea f7701a222a ifd_enumerator.go: Drop resolveTagValue
Was only used in one place and it's just a redundancy.
2020-01-12 18:56:35 -05:00
Dustin Oprea 32a5d88770 New integration of common/ and undefined/ subpackages
- common/type.go: Add FormatFromType() .
- Renamed common/type_encode.go to common/value_encoder.go .
2020-01-12 18:56:35 -05:00
Dustin Oprea 5c7dc45079 Added all tests for type.go, type_encode.go, parser.go, value_context.go, and utility.go
- Add .MODULE_ROOT anchor file to support testing.
2020-01-12 18:56:35 -05:00
Dustin Oprea bf3bc4e542 Refactor undefined-type tag processing 2020-01-12 18:56:35 -05:00
Dustin Oprea 903910b6a7 Add v2 release module 2020-01-02 07:06:28 -05:00