[SCM] libav/experimental: Decode previous 32 frames to avoid seeking artifacts in MPC

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:54:34 UTC 2013


The following commit has been merged in the experimental branch:
commit aac88b534c84a4bb7e0082b64f215762517f8e5b
Author: Kostya Shishkov <kostya.shishkov at gmail.com>
Date:   Mon Jan 1 05:32:27 2007 +0000

    Decode previous 32 frames to avoid seeking artifacts in MPC
    
    Originally committed as revision 7393 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/mpc.c b/libavcodec/mpc.c
index dcecb0e..df009f4 100644
--- a/libavcodec/mpc.c
+++ b/libavcodec/mpc.c
@@ -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,
 };
diff --git a/libavformat/mpc.c b/libavformat/mpc.c
index f06cba7..8b2358e 100644
--- a/libavformat/mpc.c
+++ b/libavformat/mpc.c
@@ -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;

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list