Mercurial > libavformat.hg
diff aviobuf.c @ 418:41da3366d341 libavformat
checksuming for nut & nice checksum API for libavformat
author | michael |
---|---|
date | Mon, 05 Apr 2004 12:02:10 +0000 |
parents | e14fcd57ad2f |
children | a35263593560 |
line wrap: on
line diff
--- a/aviobuf.c Mon Apr 05 11:36:13 2004 +0000 +++ b/aviobuf.c Mon Apr 05 12:02:10 2004 +0000 @@ -48,6 +48,8 @@ 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 @@ 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 @@ /* 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 @@ } } +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 */