63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package exifundefined
|
|
|
|
import (
|
|
"encoding/binary"
|
|
|
|
log "github.com/dsoprea/go-logging"
|
|
|
|
exifcommon "github.com/dsoprea/go-exif/v2/common"
|
|
)
|
|
|
|
// Encode encodes the given encodeable undefined value to bytes.
|
|
func Encode(value EncodeableValue, byteOrder binary.ByteOrder) (encoded []byte, unitCount uint32, err error) {
|
|
defer func() {
|
|
if state := recover(); state != nil {
|
|
err = log.Wrap(state.(error))
|
|
}
|
|
}()
|
|
|
|
encoderName := value.EncoderName()
|
|
|
|
encoder, found := encoders[encoderName]
|
|
if found == false {
|
|
log.Panicf("no encoder registered for type [%s]", encoderName)
|
|
}
|
|
|
|
encoded, unitCount, err = encoder.Encode(value, byteOrder)
|
|
log.PanicIf(err)
|
|
|
|
return encoded, unitCount, nil
|
|
}
|
|
|
|
// Decode constructs a value from raw encoded bytes
|
|
func Decode(valueContext *exifcommon.ValueContext) (value EncodeableValue, err error) {
|
|
defer func() {
|
|
if state := recover(); state != nil {
|
|
err = log.Wrap(state.(error))
|
|
}
|
|
}()
|
|
|
|
uth := UndefinedTagHandle{
|
|
IfdPath: valueContext.IfdPath(),
|
|
TagId: valueContext.TagId(),
|
|
}
|
|
|
|
decoder, found := decoders[uth]
|
|
if found == false {
|
|
// We have no choice but to return the error. We have no way of knowing how
|
|
// much data there is without already knowing what data-type this tag is.
|
|
return nil, exifcommon.ErrUnhandledUndefinedTypedTag
|
|
}
|
|
|
|
value, err = decoder.Decode(valueContext)
|
|
if err != nil {
|
|
if err == ErrUnparseableValue {
|
|
return nil, err
|
|
}
|
|
|
|
log.Panic(err)
|
|
}
|
|
|
|
return value, nil
|
|
}
|