RSI padding for encoding and decoding
authorMathis Rosenhauer <rosenhauer@dkrz.de>
Mon, 10 Feb 2014 13:28:52 +0000 (14:28 +0100)
committerMathis Rosenhauer <rosenhauer@dkrz.de>
Mon, 10 Feb 2014 13:28:52 +0000 (14:28 +0100)
src/decode.c
src/encode.c

index 73778e2..8e54b2b 100644 (file)
@@ -202,8 +202,6 @@ static inline void check_rsi_end(struct aec_stream *strm)
         state->flush_output(strm);
         state->flush_start = state->rsi_buffer;
         state->rsip = state->rsi_buffer;
-        if (strm->flags & AEC_PAD_RSI)
-            state->bitp -= state->bitp % 8;
     }
 }
 
@@ -360,8 +358,11 @@ static int m_id(struct aec_stream *strm)
 {
     struct internal_state *state = strm->state;
 
-    if (state->pp && state->rsip == state->rsi_buffer)
+    if (state->pp && state->rsip == state->rsi_buffer) {
         state->ref = 1;
+        if (strm->flags & AEC_PAD_RSI)
+            state->bitp -= state->bitp % 8;
+    }
     else
         state->ref = 0;
 
index 7b6124e..bd1a90b 100644 (file)
@@ -511,6 +511,12 @@ static int m_flush_block(struct aec_stream *strm)
     int n;
     struct internal_state *state = strm->state;
 
+    if (state->blocks_avail == 0
+        && strm->flags & AEC_PAD_RSI
+        && state->block_nonzero == 0
+        )
+        emit(state, 0, state->bits % 8);
+
     if (state->direct_out) {
         n = state->cds - strm->next_out;
         strm->next_out += n;