diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index c911e7b576a8fb16a164c3c2dad682339a2323ed..d8dac73f6ba59a463b89f0604c38b07d8e5e757e 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -211,8 +211,8 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
             }
         }
 
-	    for (i=0;i<ENCODER_DELAY_COMPENSATION*st->channels;i++)
-	        pcm_buf[i] = st->delay_buffer[i];
+        for (i=0;i<IMIN(frame_size, ENCODER_DELAY_COMPENSATION)*st->channels;i++)
+            pcm_buf[i] = st->delay_buffer[i];
         for (;i<frame_size*st->channels;i++)
             pcm_buf[i] = pcm[i-ENCODER_DELAY_COMPENSATION*st->channels];
 
@@ -220,8 +220,18 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
 
 	    /* Encode high band with CELT */
 	    ret = celt_encode_with_ec(st->celt_enc, pcm_buf, frame_size, NULL, nb_compr_bytes, &enc);
-	    for (i=0;i<ENCODER_DELAY_COMPENSATION*st->channels;i++)
-	        st->delay_buffer[i] = pcm[frame_size*st->channels-ENCODER_DELAY_COMPENSATION*st->channels+i];
+
+	    if (frame_size>ENCODER_DELAY_COMPENSATION)
+	    {
+	        for (i=0;i<ENCODER_DELAY_COMPENSATION*st->channels;i++)
+	            st->delay_buffer[i] = pcm[(frame_size-ENCODER_DELAY_COMPENSATION)*st->channels+i];
+	    } else {
+	        int tmp = ENCODER_DELAY_COMPENSATION-frame_size;
+	        for (i=0;i<tmp*st->channels;i++)
+	            st->delay_buffer[i] = st->delay_buffer[i+frame_size*st->channels];
+	        for (i=0;i<frame_size*st->channels;i++)
+	            st->delay_buffer[tmp*st->channels+i] = pcm[i];
+	    }
 	} else {
 	    ret = (ec_tell(&enc)+7)>>3;
 	    ec_enc_done(&enc);