avio: Keep track of the amount of data written

Make avio_size() work with any write AVIOContext.
pull/254/merge
Luca Barbato 8 years ago committed by Vittorio Giovara
parent fc85646ad4
commit 3f75e5116b
  1. 1
      libavformat/avio.h
  2. 13
      libavformat/aviobuf.c
  3. 2
      libavformat/version.h

@ -176,6 +176,7 @@ typedef struct AVIOContext {
*/
enum AVIODataMarkerType current_type;
int64_t last_time;
int64_t written;
} AVIOContext;
/**

@ -168,18 +168,22 @@ AVIOContext *avio_alloc_context(
static void flush_buffer(AVIOContext *s)
{
if (s->buf_ptr > s->buffer) {
int size = s->buf_ptr - s->buffer;
if (!s->error) {
int ret = 0;
if (s->write_data_type)
ret = s->write_data_type(s->opaque, s->buffer,
s->buf_ptr - s->buffer,
size,
s->current_type,
s->last_time);
else if (s->write_packet)
ret = s->write_packet(s->opaque, s->buffer,
s->buf_ptr - s->buffer);
size);
if (ret < 0) {
s->error = ret;
} else {
if (s->pos + size > s->written)
s->written = s->pos + size;
}
}
if (s->current_type == AVIO_DATA_MARKER_SYNC_POINT ||
@ -192,7 +196,7 @@ static void flush_buffer(AVIOContext *s)
s->buf_ptr - s->checksum_ptr);
s->checksum_ptr = s->buffer;
}
s->pos += s->buf_ptr - s->buffer;
s->pos += size;
}
s->buf_ptr = s->buffer;
}
@ -301,6 +305,9 @@ int64_t avio_size(AVIOContext *s)
if (!s)
return AVERROR(EINVAL);
if (s->written)
return s->written;
if (!s->seek)
return AVERROR(ENOSYS);
size = s->seek(s->opaque, 0, AVSEEK_SIZE);

@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 57
#define LIBAVFORMAT_VERSION_MINOR 10
#define LIBAVFORMAT_VERSION_MICRO 1
#define LIBAVFORMAT_VERSION_MICRO 2
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \

Loading…
Cancel
Save