[FFmpeg-trac] #7889(avcodec:new): garbled output with transparent GIF
FFmpeg
trac at avcodec.org
Wed May 8 19:23:17 EEST 2019
#7889: garbled output with transparent GIF
-------------------------------------+-------------------------------------
Reporter: bjorn | Type: defect
Status: new | Priority: normal
Component: avcodec | Version:
Keywords: gif, | unspecified
transparent | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
How to reproduce:
{{{
$ ./ffmpeg -i source_sticker.gif -filter_complex
'[0:v]scale=100:-1,split[a][b];[a]palettegen[p];[b][p]paletteuse' out.gif
On OS X produces various problems:
- in FFMPeg 4.1.3 it enters an infinite loop.
- in FFMPEG master, it produces garbled output.
}}}
Here's the patch:
{{{
diff --git a/libavcodec/gif.c b/libavcodec/gif.c
index 94c8b1af49..d7768b4426 100644
--- a/libavcodec/gif.c
+++ b/libavcodec/gif.c
@@ -136,7 +136,7 @@ static void gif_crop_translucent(AVCodecContext
*avctx,
while (*y_start < y_end) {
int is_trans = 1;
for (int i = 0; i < w; i++) {
- if (buf[w * *y_start + i] != trans) {
+ if (buf[linesize * *y_start + i] != trans) {
is_trans = 0;
break;
}
@@ -148,10 +148,10 @@ static void gif_crop_translucent(AVCodecContext
*avctx,
}
// crop bottom
- while (y_end < h) {
+ while (y_end > *y_start) {
int is_trans = 1;
for (int i = 0; i < w; i++) {
- if (buf[w * y_end + i] != trans) {
+ if (buf[linesize * y_end + i] != trans) {
is_trans = 0;
break;
}
@@ -165,7 +165,7 @@ static void gif_crop_translucent(AVCodecContext
*avctx,
while (*x_start < x_end) {
int is_trans = 1;
for (int i = *y_start; i < y_end; i++) {
- if (buf[w * i + *x_start] != trans) {
+ if (buf[linesize * i + *x_start] != trans) {
is_trans = 0;
break;
}
@@ -176,10 +176,10 @@ static void gif_crop_translucent(AVCodecContext
*avctx,
}
// crop right
- while (x_end < w) {
+ while (x_end > *x_start) {
int is_trans = 1;
for (int i = *y_start; i < y_end; i++) {
- if (buf[w * i + x_end] != trans) {
+ if (buf[linesize * i + x_end] != trans) {
is_trans = 0;
break;
}
}}}
--
Ticket URL: <https://trac.ffmpeg.org/ticket/7889>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list