summaryrefslogtreecommitdiff
path: root/libavformat/aviobuf.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2004-04-05 12:02:10 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-04-05 12:02:10 +0000
commitee9f36a88eb3e2706ea659acb0ca80c414fa5d8a (patch)
treefad9f203172659788226c6e762d661ef97014be7 /libavformat/aviobuf.c
parent5e9b83f5d7e5b8c9182e2ee6a1baf3e86aec0a17 (diff)
checksuming for nut & nice checksum API for libavformat
Originally committed as revision 2969 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/aviobuf.c')
-rw-r--r--libavformat/aviobuf.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 75f97a5b40..ebc2f74910 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -48,6 +48,8 @@ int init_put_byte(ByteIOContext *s,
s->eof_reached = 0;
s->is_streamed = 0;
s->max_packet_size = 0;
+ s->checksum_ptr= NULL;
+ s->update_checksum= NULL;
return 0;
}
@@ -58,6 +60,10 @@ static void flush_buffer(ByteIOContext *s)
if (s->buf_ptr > s->buffer) {
if (s->write_packet)
s->write_packet(s->opaque, s->buffer, s->buf_ptr - s->buffer);
+ if(s->checksum_ptr){
+ s->checksum= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_ptr - s->checksum_ptr);
+ s->checksum_ptr= s->buffer;
+ }
s->pos += s->buf_ptr - s->buffer;
}
s->buf_ptr = s->buffer;
@@ -243,6 +249,12 @@ static void fill_buffer(ByteIOContext *s)
/* no need to do anything if EOF already reached */
if (s->eof_reached)
return;
+
+ if(s->checksum_ptr){
+ s->checksum= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_end - s->checksum_ptr);
+ s->checksum_ptr= s->buffer;
+ }
+
len = s->read_packet(s->opaque, s->buffer, s->buffer_size);
if (len <= 0) {
/* do not modify buffer if EOF reached so that a seek back can
@@ -255,6 +267,18 @@ static void fill_buffer(ByteIOContext *s)
}
}
+unsigned long get_checksum(ByteIOContext *s){
+ s->checksum= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_ptr - s->checksum_ptr);
+ s->checksum_ptr= NULL;
+ return s->checksum;
+}
+
+void init_checksum(ByteIOContext *s, unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum){
+ s->update_checksum= update_checksum;
+ s->checksum= s->update_checksum(checksum, NULL, 0);
+ s->checksum_ptr= s->buf_ptr;
+}
+
/* NOTE: return 0 if EOF, so you cannot use it if EOF handling is
necessary */
/* XXX: put an inline version */