Decode previous 32 frames to avoid seeking artifacts in MPC
authorKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 1 Jan 2007 05:32:27 +0000 (05:32 +0000)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 1 Jan 2007 05:32:27 +0000 (05:32 +0000)
Originally committed as revision 7393 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/mpc.c
libavformat/mpc.c

index dcecb0ee5a0085f8fb23c12f07f804e45e7e4929..df009f48762700d53017383569a003ae466d6100 100644 (file)
@@ -51,6 +51,7 @@ typedef struct {
     int lastframelen, bands;
     int oldDSCF[2][BANDS];
     int rnd;
+    int frames_to_skip;
     /* for synthesis */
     DECLARE_ALIGNED_16(MPA_INT, synth_buf[MPA_MAX_CHANNELS][512*2]);
     int synth_buf_offset[MPA_MAX_CHANNELS];
@@ -98,6 +99,7 @@ static int mpc7_decode_init(AVCodecContext * avctx)
     c->lastframelen = get_bits(&gb, 11);
     av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n",
             c->IS, c->MSS, c->gapless, c->lastframelen, c->bands);
+    c->frames_to_skip = 0;
 
     if(vlc_inited) return 0;
     av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n");
@@ -328,11 +330,23 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
         av_log(NULL,0, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);
         return -1;
     }
+    if(c->frames_to_skip){
+        c->frames_to_skip--;
+        *data_size = 0;
+        return buf_size;
+    }
     *data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4;
 
     return buf_size;
 }
 
+static void mpc7_decode_flush(AVCodecContext *avctx)
+{
+    MPCContext *c = avctx->priv_data;
+
+    memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
+    c->frames_to_skip = 32;
+}
 
 AVCodec mpc7_decoder = {
     "mpc sv7",
@@ -343,4 +357,5 @@ AVCodec mpc7_decoder = {
     NULL,
     NULL,
     mpc7_decode_frame,
+    .flush = mpc7_decode_flush,
 };
index f06cba762985c9eaeb947a13655ecf9cc8609685..8b2358ea484b3ee5b87eca7d9476439e2270b5b0 100644 (file)
@@ -22,6 +22,7 @@
 #include "bitstream.h"
 
 #define MPC_FRAMESIZE  1152
+#define DELAY_FRAMES   32
 
 static const int mpc_rate[4] = { 44100, 48000, 37800, 32000 };
 typedef struct {
@@ -155,6 +156,7 @@ static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt)
     pkt->data[1] = (c->curframe > c->fcount);
 
     pkt->stream_index = 0;
+    pkt->pts = cur;
     ret = get_buffer(&s->pb, pkt->data + 4, size);
     if(c->curbits)
         url_fseek(&s->pb, -4, SEEK_CUR);
@@ -188,7 +190,7 @@ static int mpc_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
     MPCContext *c = s->priv_data;
     AVPacket pkt1, *pkt = &pkt1;
     int ret;
-    int index = av_index_search_timestamp(st, timestamp, flags);
+    int index = av_index_search_timestamp(st, timestamp - DELAY_FRAMES, flags);
     uint32_t lastframe;
 
     /* if found, seek there */
@@ -199,6 +201,7 @@ static int mpc_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
     /* if timestamp is out of bounds, return error */
     if(timestamp < 0 || timestamp >= c->fcount)
         return -1;
+    timestamp -= DELAY_FRAMES;
     /* seek to the furthest known position and read packets until
        we reach desired position */
     lastframe = c->curframe;