You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
img2dec: support seeking in infinitely looped stream
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -46,6 +46,7 @@ typedef struct {
|
|||||||
int img_first;
|
int img_first;
|
||||||
int img_last;
|
int img_last;
|
||||||
int img_number;
|
int img_number;
|
||||||
|
int64_t pts;
|
||||||
int img_count;
|
int img_count;
|
||||||
int is_pipe;
|
int is_pipe;
|
||||||
int split_planes; /**< use independent file for each Y, U, V plane */
|
int split_planes; /**< use independent file for each Y, U, V plane */
|
||||||
@@ -393,8 +394,8 @@ static int img_read_packet(AVFormatContext *s1, AVPacket *pkt)
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
pkt->stream_index = 0;
|
pkt->stream_index = 0;
|
||||||
pkt->flags |= AV_PKT_FLAG_KEY;
|
pkt->flags |= AV_PKT_FLAG_KEY;
|
||||||
if (!s->is_pipe && !s->loop)
|
if (!s->is_pipe)
|
||||||
pkt->pts = s->img_number - s->img_first;
|
pkt->pts = s->pts;
|
||||||
|
|
||||||
pkt->size = 0;
|
pkt->size = 0;
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
@@ -413,6 +414,7 @@ static int img_read_packet(AVFormatContext *s1, AVPacket *pkt)
|
|||||||
} else {
|
} else {
|
||||||
s->img_count++;
|
s->img_count++;
|
||||||
s->img_number++;
|
s->img_number++;
|
||||||
|
s->pts++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -432,9 +434,10 @@ static int img_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
|
|||||||
{
|
{
|
||||||
VideoDemuxData *s1 = s->priv_data;
|
VideoDemuxData *s1 = s->priv_data;
|
||||||
|
|
||||||
if (timestamp < 0 || timestamp > s1->img_last - s1->img_first)
|
if (timestamp < 0 || !s1->loop && timestamp > s1->img_last - s1->img_first)
|
||||||
return -1;
|
return -1;
|
||||||
s1->img_number = timestamp + s1->img_first;
|
s1->img_number = timestamp%(s1->img_last - s1->img_first + 1) + s1->img_first;
|
||||||
|
s1->pts = timestamp;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user