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 */