[FFmpeg-devel] [PATCH v2 0/3] [RFC] Exif Overhaul

James Almer jamrial at gmail.com
Mon Sep 30 02:01:39 EEST 2024


On 9/16/2024 11:43 AM, Leo Izen wrote:
> I've made some changes to the last EXIF overhaul patch I sent,
> notably I fixed up some bugs and added MakerNote parsing, so it
> should not corrupt MakerNotes that are inside TIFF files.
> 
> MakerNote is supposed to be a binary blob but many camera manufacturers
> treat it as an IFD (e.g. Canon) with offsets relative to the start of the file,
> so it has to be parsed in order to move it from TIFF to another file or it will
> be corrupted.
> 
> I also fixed the fate tests now that pngenc.c writes eXIf chunks, so those should
> pass.
> 
> I haven't come up with a solution that Andreas proposed, which is:
> 
>> If I see this correctly, then these patches can lead to a situation
>> where an input packet has rotation metadata in exif which gets exported
>> twice -- as displaymatrix and as exif metadata side data. If the user
>> changes the displaymatrix (e.g. applies the transformation to the image
>> data and removes the displaymatrix side data before reencoding), the
>> exif data (that the user would probably not be aware of) would still be
>> there and get propagated into the output, corrupting it.
> 
> Zeroing out the EXIF orientation tag upon attaching the displaymatrix is
> something I did consider, but it would corrupt encoding unless I also read
> the displaymatrix data and attach it as EXIF orientation. This isn't too hard
> if the Orientation tag exists but it's more difficult if it doesn't already
> exist. It's also not clear what to do if the AVDisplayMatrix is not in the
> dihedral group D4.
> 
> Currently there's no code that takes an AVDictionary and writes it back into
> EXIF as these are not compatible structures. EXIF includes integers of varying
> lengths, while AVDictionary contains strings only.

Conversion from AVDictionary to coded EXIF metadata would be lossy 
anyway because of the double type.
What you could do i guess is write a function that removes a given entry 
from a raw EXIF buffer.

> 
> Leo Izen (3):
>    various: change EXIF metadata into AVFrameSideData
>    avcodec/pngdec: parse eXIf chunk
>    avcodec/pngenc: write eXIf chunks
> 
>   fftools/ffprobe.c                        |  27 +-
>   libavcodec/Makefile                      |   1 +
>   libavcodec/exif.c                        | 394 +++++++++++++++++++++--
>   libavcodec/exif.h                        |  32 +-
>   libavcodec/exif_internal.h               |  55 ++++
>   libavcodec/mjpegdec.c                    |  91 +-----
>   libavcodec/mjpegdec.h                    |   2 +-
>   libavcodec/pngdec.c                      |  35 ++
>   libavcodec/pngenc.c                      |   4 +
>   libavcodec/tiff.c                        |  19 +-
>   libavcodec/tiff.h                        |   1 +
>   libavcodec/version.h                     |   2 +-
>   libavcodec/webp.c                        |  38 +--
>   libavformat/avidec.c                     |   4 +-
>   libavutil/frame.c                        |   2 +
>   libavutil/frame.h                        |   6 +
>   tests/ref/fate/cover-art-mp3-id3v2-remux |   6 +-
>   tests/ref/fate/exif-image-embedded       |   5 +-
>   tests/ref/fate/exif-image-jpg            |  91 +++---
>   tests/ref/fate/exif-image-webp           |  91 +++---
>   tests/ref/fate/mov-cover-image           |   6 +-
>   21 files changed, 676 insertions(+), 236 deletions(-)
>   create mode 100644 libavcodec/exif_internal.h
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20240929/278f3cfb/attachment.sig>


More information about the ffmpeg-devel mailing list