lavf/gif: Add an option max_gif_delay to limit the frame duration.
Allows playback for the sample from ticket #4369 in less than 18 hours.
This commit is contained in:
parent
268ff17cb7
commit
7de0fefeb5
@ -205,6 +205,11 @@ It accepts the following options:
|
|||||||
Set the minimum valid delay between frames in hundredths of seconds.
|
Set the minimum valid delay between frames in hundredths of seconds.
|
||||||
Range is 0 to 6000. Default value is 2.
|
Range is 0 to 6000. Default value is 2.
|
||||||
|
|
||||||
|
@item max_gif_delay
|
||||||
|
Set the maximum valid delay between frames in hundredth of seconds.
|
||||||
|
Range is 0 to 65535. Default value is 65535 (nearly eleven minutes),
|
||||||
|
the maximum value allowed by the specification.
|
||||||
|
|
||||||
@item default_delay
|
@item default_delay
|
||||||
Set the default delay between frames in hundredths of seconds.
|
Set the default delay between frames in hundredths of seconds.
|
||||||
Range is 0 to 6000. Default value is 10.
|
Range is 0 to 6000. Default value is 10.
|
||||||
|
@ -43,6 +43,7 @@ typedef struct GIFDemuxContext {
|
|||||||
* invalid and set to value of default_delay.
|
* invalid and set to value of default_delay.
|
||||||
*/
|
*/
|
||||||
int min_delay;
|
int min_delay;
|
||||||
|
int max_delay;
|
||||||
int default_delay;
|
int default_delay;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -159,6 +160,7 @@ static int gif_read_ext(AVFormatContext *s)
|
|||||||
|
|
||||||
if (gdc->delay < gdc->min_delay)
|
if (gdc->delay < gdc->min_delay)
|
||||||
gdc->delay = gdc->default_delay;
|
gdc->delay = gdc->default_delay;
|
||||||
|
gdc->delay = FFMIN(gdc->delay, gdc->max_delay);
|
||||||
|
|
||||||
/* skip the rest of the Graphic Control Extension block */
|
/* skip the rest of the Graphic Control Extension block */
|
||||||
if ((ret = avio_skip(pb, sb_size - 3)) < 0 )
|
if ((ret = avio_skip(pb, sb_size - 3)) < 0 )
|
||||||
@ -309,6 +311,7 @@ resync:
|
|||||||
|
|
||||||
static const AVOption options[] = {
|
static const AVOption options[] = {
|
||||||
{ "min_delay" , "minimum valid delay between frames (in hundredths of second)", offsetof(GIFDemuxContext, min_delay) , AV_OPT_TYPE_INT, {.i64 = GIF_MIN_DELAY} , 0, 100 * 60, AV_OPT_FLAG_DECODING_PARAM },
|
{ "min_delay" , "minimum valid delay between frames (in hundredths of second)", offsetof(GIFDemuxContext, min_delay) , AV_OPT_TYPE_INT, {.i64 = GIF_MIN_DELAY} , 0, 100 * 60, AV_OPT_FLAG_DECODING_PARAM },
|
||||||
|
{ "max_gif_delay", "maximum valid delay between frames (in hundredths of seconds)", offsetof(GIFDemuxContext, max_delay) , AV_OPT_TYPE_INT, {.i64 = 65535} , 0, 65535 , AV_OPT_FLAG_DECODING_PARAM },
|
||||||
{ "default_delay", "default delay between frames (in hundredths of second)" , offsetof(GIFDemuxContext, default_delay), AV_OPT_TYPE_INT, {.i64 = GIF_DEFAULT_DELAY}, 0, 100 * 60, AV_OPT_FLAG_DECODING_PARAM },
|
{ "default_delay", "default delay between frames (in hundredths of second)" , offsetof(GIFDemuxContext, default_delay), AV_OPT_TYPE_INT, {.i64 = GIF_DEFAULT_DELAY}, 0, 100 * 60, AV_OPT_FLAG_DECODING_PARAM },
|
||||||
{ "ignore_loop" , "ignore loop setting (netscape extension)" , offsetof(GIFDemuxContext, ignore_loop) , AV_OPT_TYPE_INT, {.i64 = 1} , 0, 1, AV_OPT_FLAG_DECODING_PARAM },
|
{ "ignore_loop" , "ignore loop setting (netscape extension)" , offsetof(GIFDemuxContext, ignore_loop) , AV_OPT_TYPE_INT, {.i64 = 1} , 0, 1, AV_OPT_FLAG_DECODING_PARAM },
|
||||||
{ NULL },
|
{ NULL },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user