img2dec: Add ts_from_file option

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Andrey Utkin 2013-05-24 16:50:36 +03:00 committed by Michael Niedermayer
parent 2c2e69b3a2
commit 70fbfd75c3
2 changed files with 20 additions and 2 deletions

View File

@ -210,6 +210,10 @@ to read from. Default value is 0.
Set the index interval range to check when looking for the first image Set the index interval range to check when looking for the first image
file in the sequence, starting from @var{start_number}. Default value file in the sequence, starting from @var{start_number}. Default value
is 5. is 5.
@item ts_from_file
If set to 1, will set frame timestamp to modification time of image file. Note
that monotonity of timestamps is not provided: images go in the same order as
without this option. Default value is 0.
@item video_size @item video_size
Set the video size of the images to read. If not specified the video Set the video size of the images to read. If not specified the video
size is guessed from the first image file in the sequence. size is guessed from the first image file in the sequence.

View File

@ -20,6 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <sys/stat.h>
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "libavutil/log.h" #include "libavutil/log.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
@ -63,6 +64,7 @@ typedef struct {
int start_number; int start_number;
int start_number_range; int start_number_range;
int frame_size; int frame_size;
int ts_from_file;
} VideoDemuxData; } VideoDemuxData;
static const int sizes[][2] = { static const int sizes[][2] = {
@ -223,7 +225,10 @@ static int img_read_header(AVFormatContext *s1)
st->need_parsing = AVSTREAM_PARSE_FULL; st->need_parsing = AVSTREAM_PARSE_FULL;
} }
avpriv_set_pts_info(st, 60, s->framerate.den, s->framerate.num); if (s->ts_from_file)
avpriv_set_pts_info(st, 60, 1, 1);
else
avpriv_set_pts_info(st, 60, s->framerate.den, s->framerate.num);
if (s->width && s->height) { if (s->width && s->height) {
st->codec->width = s->width; st->codec->width = s->width;
@ -381,8 +386,14 @@ 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) if (s->ts_from_file) {
struct stat img_stat;
if (stat(filename, &img_stat))
return AVERROR(EIO);
pkt->pts = (int64_t)img_stat.st_mtime;
} else if (!s->is_pipe) {
pkt->pts = s->pts; pkt->pts = s->pts;
}
pkt->size = 0; pkt->size = 0;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
@ -420,6 +431,8 @@ static int img_read_close(struct AVFormatContext* s1)
static int img_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) static int img_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
{ {
VideoDemuxData *s1 = s->priv_data; VideoDemuxData *s1 = s->priv_data;
if (s1->ts_from_file) /* Seeking is not supported in this case */
return AVERROR(ESPIPE);
if (timestamp < 0 || !s1->loop && timestamp > s1->img_last - s1->img_first) if (timestamp < 0 || !s1->loop && timestamp > s1->img_last - s1->img_first)
return -1; return -1;
@ -444,6 +457,7 @@ static const AVOption options[] = {
{ "start_number_range", "set range for looking at the first sequence number", OFFSET(start_number_range), AV_OPT_TYPE_INT, {.i64 = 5}, 1, INT_MAX, DEC }, { "start_number_range", "set range for looking at the first sequence number", OFFSET(start_number_range), AV_OPT_TYPE_INT, {.i64 = 5}, 1, INT_MAX, DEC },
{ "video_size", "set video size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC }, { "video_size", "set video size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },
{ "frame_size", "force frame size in bytes", OFFSET(frame_size), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, DEC }, { "frame_size", "force frame size in bytes", OFFSET(frame_size), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, DEC },
{ "ts_from_file", "set frame timestamp from file's one", OFFSET(ts_from_file), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, DEC },
{ NULL }, { NULL },
}; };