|
@@ -52,6 +52,9 @@ typedef struct GIFDemuxContext { |
|
|
int total_iter; |
|
|
int total_iter; |
|
|
int iter_count; |
|
|
int iter_count; |
|
|
int ignore_loop; |
|
|
int ignore_loop; |
|
|
|
|
|
|
|
|
|
|
|
int nb_frames; |
|
|
|
|
|
int last_duration; |
|
|
} GIFDemuxContext; |
|
|
} GIFDemuxContext; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@@ -279,6 +282,9 @@ parse_keyframe: |
|
|
pkt->stream_index = 0; |
|
|
pkt->stream_index = 0; |
|
|
pkt->duration = gdc->delay; |
|
|
pkt->duration = gdc->delay; |
|
|
|
|
|
|
|
|
|
|
|
gdc->nb_frames ++; |
|
|
|
|
|
gdc->last_duration = pkt->duration; |
|
|
|
|
|
|
|
|
/* Graphic Control Extension's scope is single frame. |
|
|
/* Graphic Control Extension's scope is single frame. |
|
|
* Remove its influence. */ |
|
|
* Remove its influence. */ |
|
|
gdc->delay = gdc->default_delay; |
|
|
gdc->delay = gdc->default_delay; |
|
@@ -299,6 +305,9 @@ resync: |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if ((ret >= 0 && !frame_parsed) || ret == AVERROR_EOF) { |
|
|
if ((ret >= 0 && !frame_parsed) || ret == AVERROR_EOF) { |
|
|
|
|
|
if (gdc->nb_frames == 1) { |
|
|
|
|
|
s->streams[0]->r_frame_rate = (AVRational) {100, gdc->last_duration}; |
|
|
|
|
|
} |
|
|
/* This might happen when there is no image block |
|
|
/* This might happen when there is no image block |
|
|
* between extension blocks and GIF_TRAILER or EOF */ |
|
|
* between extension blocks and GIF_TRAILER or EOF */ |
|
|
if (!gdc->ignore_loop && (block_label == GIF_TRAILER || avio_feof(pb)) |
|
|
if (!gdc->ignore_loop && (block_label == GIF_TRAILER || avio_feof(pb)) |
|
|