diff --git a/gst/elements/gstfilesrc.c b/gst/elements/gstfilesrc.c index d20176c542..c9e0772f0f 100644 --- a/gst/elements/gstfilesrc.c +++ b/gst/elements/gstfilesrc.c @@ -745,10 +745,18 @@ gst_filesrc_srcpad_query (GstPad *pad, GstPadQueryType type, *value = src->filelen; break; case GST_PAD_QUERY_POSITION: - if (*format != GST_FORMAT_BYTES) { - return FALSE; + switch (*format) { + case GST_FORMAT_BYTES: + *value = src->curoffset; + break; + case GST_FORMAT_PERCENT: + if (src->filelen == 0) + return FALSE; + *value = src->curoffset * GST_FORMAT_PERCENT_MAX / src->filelen; + break; + default: + return FALSE; } - *value = src->curoffset; break; default: return FALSE; diff --git a/gst/gstformat.h b/gst/gstformat.h index f4fa251d2e..429862f765 100644 --- a/gst/gstformat.h +++ b/gst/gstformat.h @@ -40,6 +40,10 @@ typedef enum { GST_FORMAT_UNITS = 6 } GstFormat; +/* a percentage is always relative to 1000000 */ +#define GST_FORMAT_PERCENT_MAX 1000000LL +#define GST_FORMAT_PERCENT_SCALE 10000LL + typedef struct _GstFormatDefinition GstFormatDefinition; struct _GstFormatDefinition diff --git a/plugins/elements/gstfilesrc.c b/plugins/elements/gstfilesrc.c index d20176c542..c9e0772f0f 100644 --- a/plugins/elements/gstfilesrc.c +++ b/plugins/elements/gstfilesrc.c @@ -745,10 +745,18 @@ gst_filesrc_srcpad_query (GstPad *pad, GstPadQueryType type, *value = src->filelen; break; case GST_PAD_QUERY_POSITION: - if (*format != GST_FORMAT_BYTES) { - return FALSE; + switch (*format) { + case GST_FORMAT_BYTES: + *value = src->curoffset; + break; + case GST_FORMAT_PERCENT: + if (src->filelen == 0) + return FALSE; + *value = src->curoffset * GST_FORMAT_PERCENT_MAX / src->filelen; + break; + default: + return FALSE; } - *value = src->curoffset; break; default: return FALSE;