#7902: GIF transparent frames overlapping
-------------------------------------+-------------------------------------
             Reporter:  kolopo       |                    Owner:
                 Type:  defect       |                   Status:  new
             Priority:  normal       |                Component:
                                     |  undetermined
              Version:  git-master   |               Resolution:
             Keywords:  gif          |               Blocked By:
  disposal                           |
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
Changes (by RedError):

 * cc: rederrorsuru@… (added)
 * keywords:  gif alpha => gif disposal


Comment:

 When creating a gif with transparency with ffmpeg, the first frame has a
 wrong "Gif Disposal" value (1 "Do Not Dispose" instead of 0 "No disposal"
 or 2 "Restore to Background" like all the other frames) and thus is always
 overlayed on the second frame.

 How to reproduce (ffmpeg version git-2020-03-24-e5d25d1):
 {{{
 ffmpeg -i "slowsmoke.gif" -gifflags 0 -vf "[0:v] split [a][b]; [a]
 palettegen [p]; [b][p] paletteuse [r]" "slowsmoke ffmpeg.gif" -y
 }}}

 Input slowsmoke.gif:
 [[Image(https://i.ibb.co/mzSx63y/slowsmoke.gif)]]
 Output "slowsmoke ffmpeg.gif":
 [[Image(https://i.imgur.com/cnd96Wq.gif)]]

 Additional details:
 * The disposal info of the faulty gif can be viewed in advanced gif
 editors. For example, Gimp shows the second frame as being "combine".
 '''Editing that information allows the gif to be fixed.''' This proves
 that it is indeed the frame disposal that is in cause.
 [[Image(https://i.imgur.com/GFD9AgG.png)]]
 * -gifflags +offsetting leaves additional traces for next frames (by
 reducing the frame draw area) as underlined in the OP, so it's better
 disabled in this case with -gifflags 0 like I did, but I don't think
 that's directly related to the underlying first frame disposal issue.
 [[Image(https://i.imgur.com/MNtPeA1.gif)]]
 * -gifflags -transdiff or +transdiff cannot actually do anything for
 transparent gifs, because of the presence of transparency in the refresh
 area (cannot combine layers based on transparent holes), so it's also not
 directly related.
 * The Disposal method is different with non-transparent gifs, so the
 encoding error might be close to where the difference in Disposal is
 handled when saving a frame/first frame. [https://i.imgur.com/usgKA0J.png
 Example]
 * Explanation of "Do Not Dispose" Gif Disposal: «any pixels not covered up
 by the next frame continue to display.»
 http://webreference.com/content/studio/disposal.html  Numerical values of
 each disposal mode taken from: https://www.w3.org/Graphics/GIF/spec-
 gif89a.txt

 png's alpha transparency was unrelated so I removed the keyword.

--
Ticket URL: <https://trac.ffmpeg.org/ticket/7902#comment:4>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
_______________________________________________
FFmpeg-trac mailing list
FFmpeg-trac@avcodec.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-trac

To unsubscribe, visit link above, or email
ffmpeg-trac-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to