[FFmpeg-soc] [soc]: r583 - in dirac: ffmpeg.diff libavcodec/dirac.c

marco subversion at mplayerhq.hu
Wed Aug 1 13:55:55 CEST 2007


Author: marco
Date: Wed Aug  1 13:55:55 2007
New Revision: 583

Log:
fix a bug in decoding signed integers

Modified:
   dirac/ffmpeg.diff
   dirac/libavcodec/dirac.c

Modified: dirac/ffmpeg.diff
==============================================================================
--- dirac/ffmpeg.diff	(original)
+++ dirac/ffmpeg.diff	Wed Aug  1 13:55:55 2007
@@ -1,6 +1,6 @@
 Index: libavcodec/golomb.c
 ===================================================================
---- libavcodec/golomb.c	(revision 9779)
+--- libavcodec/golomb.c	(revision 9833)
 +++ libavcodec/golomb.c	(working copy)
 @@ -1,6 +1,7 @@
  /*
@@ -61,7 +61,7 @@ Index: libavcodec/golomb.c
 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
 Index: libavcodec/golomb.h
 ===================================================================
---- libavcodec/golomb.h	(revision 9779)
+--- libavcodec/golomb.h	(revision 9833)
 +++ libavcodec/golomb.h	(working copy)
 @@ -2,6 +2,7 @@
   * exp golomb vlc stuff
@@ -89,7 +89,7 @@ Index: libavcodec/golomb.h
  
  
   /**
-@@ -106,6 +109,59 @@
+@@ -106,6 +109,60 @@
      }
  }
  
@@ -134,6 +134,7 @@ Index: libavcodec/golomb.h
 +    }
 +    ret--;
 +
++    UPDATE_CACHE(re, gb);
 +    buf = GET_CACHE(re, gb);
 +    if (ret) {
 +        LAST_SKIP_BITS(re, gb, 1);
@@ -151,7 +152,7 @@ Index: libavcodec/golomb.h
   */
 Index: libavcodec/Makefile
 ===================================================================
---- libavcodec/Makefile	(revision 9779)
+--- libavcodec/Makefile	(revision 9833)
 +++ libavcodec/Makefile	(working copy)
 @@ -52,6 +52,7 @@
  OBJS-$(CONFIG_CSCD_DECODER)            += cscd.o
@@ -171,7 +172,7 @@ Index: libavcodec/Makefile
  OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
 Index: libavcodec/allcodecs.c
 ===================================================================
---- libavcodec/allcodecs.c	(revision 9779)
+--- libavcodec/allcodecs.c	(revision 9833)
 +++ libavcodec/allcodecs.c	(working copy)
 @@ -68,6 +68,7 @@
      REGISTER_DECODER(CLJR, cljr);
@@ -181,7 +182,7 @@ Index: libavcodec/allcodecs.c
      REGISTER_DECODER(DNXHD, dnxhd);
      REGISTER_DECODER(DSICINVIDEO, dsicinvideo);
      REGISTER_ENCDEC (DVVIDEO, dvvideo);
-@@ -262,6 +263,7 @@
+@@ -263,6 +264,7 @@
      REGISTER_PARSER (AC3, ac3);
      REGISTER_PARSER (CAVSVIDEO, cavsvideo);
      REGISTER_PARSER (DCA, dca);
@@ -191,7 +192,7 @@ Index: libavcodec/allcodecs.c
      REGISTER_PARSER (H261, h261);
 Index: libavcodec/allcodecs.h
 ===================================================================
---- libavcodec/allcodecs.h	(revision 9779)
+--- libavcodec/allcodecs.h	(revision 9833)
 +++ libavcodec/allcodecs.h	(working copy)
 @@ -92,6 +92,7 @@
  extern AVCodec cscd_decoder;
@@ -203,7 +204,7 @@ Index: libavcodec/allcodecs.h
  extern AVCodec dsicinvideo_decoder;
 Index: libavcodec/avcodec.h
 ===================================================================
---- libavcodec/avcodec.h	(revision 9779)
+--- libavcodec/avcodec.h	(revision 9833)
 +++ libavcodec/avcodec.h	(working copy)
 @@ -166,6 +166,7 @@
      CODEC_ID_BETHSOFTVID,
@@ -213,7 +214,7 @@ Index: libavcodec/avcodec.h
  
      /* various PCM "codecs" */
      CODEC_ID_PCM_S16LE= 0x10000,
-@@ -2767,6 +2768,7 @@
+@@ -2769,6 +2770,7 @@
  extern AVCodecParser ac3_parser;
  extern AVCodecParser cavsvideo_parser;
  extern AVCodecParser dca_parser;
@@ -223,7 +224,7 @@ Index: libavcodec/avcodec.h
  extern AVCodecParser h261_parser;
 Index: libavformat/Makefile
 ===================================================================
---- libavformat/Makefile	(revision 9779)
+--- libavformat/Makefile	(revision 9833)
 +++ libavformat/Makefile	(working copy)
 @@ -36,6 +36,7 @@
  OBJS-$(CONFIG_CRC_MUXER)                 += crc.o
@@ -235,7 +236,7 @@ Index: libavformat/Makefile
  OBJS-$(CONFIG_DV_DEMUXER)                += dv.o
 Index: libavformat/raw.c
 ===================================================================
---- libavformat/raw.c	(revision 9779)
+--- libavformat/raw.c	(revision 9833)
 +++ libavformat/raw.c	(working copy)
 @@ -316,6 +316,7 @@
          av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
@@ -281,7 +282,7 @@ Index: libavformat/raw.c
      "raw dts",
 Index: libavformat/allformats.c
 ===================================================================
---- libavformat/allformats.c	(revision 9779)
+--- libavformat/allformats.c	(revision 9833)
 +++ libavformat/allformats.c	(working copy)
 @@ -66,6 +66,7 @@
      REGISTER_MUXER   (CRC, crc);
@@ -293,7 +294,7 @@ Index: libavformat/allformats.c
      REGISTER_MUXDEMUX(DV, dv);
 Index: libavformat/allformats.h
 ===================================================================
---- libavformat/allformats.h	(revision 9779)
+--- libavformat/allformats.h	(revision 9833)
 +++ libavformat/allformats.h	(working copy)
 @@ -39,6 +39,7 @@
  extern AVInputFormat c93_demuxer;

Modified: dirac/libavcodec/dirac.c
==============================================================================
--- dirac/libavcodec/dirac.c	(original)
+++ dirac/libavcodec/dirac.c	Wed Aug  1 13:55:55 2007
@@ -224,6 +224,9 @@ struct dirac_blockmotion {
     int dc[3];
 };
 
+/* XXX */
+#define REFFRAME_CNT 20
+
 typedef struct DiracContext {
     int next_picture;
     int access_unit;
@@ -234,6 +237,11 @@ typedef struct DiracContext {
 
     AVFrame picture;
 
+    int picnum;
+    int ref_first;
+    int ref_last;
+    AVFrame refframes[REFFRAME_CNT]; /* XXX */
+
     struct source_parameters source;
     struct sequence_parameters sequence;
     struct decoding_parameters decoding;
@@ -277,6 +285,11 @@ typedef struct DiracContext {
 } DiracContext;
 
 static int decode_init(AVCodecContext *avctx){
+    DiracContext *s = avctx->priv_data;
+
+/*     s->ref_first = 0; */
+/*     s->ref_last  = 0; */
+
     av_log_set_level(AV_LOG_DEBUG);
     return 0;
 }
@@ -1813,6 +1826,37 @@ static int dirac_idwt(AVCodecContext *av
     return 0;
 }
 
+static int dirac_motion_compensation(AVCodecContext *avctx, int *coeffs, int comp) {
+    DiracContext *s = avctx->priv_data;
+    int x, y;
+    int width, height;
+    int xblen, yblen;
+    int xbsep, ybsep;
+    int xoffset, yoffset;
+
+    if (comp == 0) {
+        width  = s->sequence.luma_width;
+        height = s->sequence.luma_height;
+        xblen  = s->frame_decoding.luma_yblen;
+        yblen  = s->frame_decoding.luma_xblen;
+    } else {
+        width  = s->sequence.chroma_width;
+        height = s->sequence.chroma_height;
+        xblen  = s->frame_decoding.chroma_yblen;
+        yblen  = s->frame_decoding.chroma_xblen;
+    }
+
+    xoffset = (xblen - ybsep) / 2;
+    yoffset = (yblen - ybsep) / 2;
+
+/*     for (y = 0; y < height; y++) */
+/*         for (x = 0; x < width; x++) { */
+/*             coeffs[y * s->padded_width + x] += motion_comp(avctx, x, y, coeffs,  */
+/*         } */
+
+    return 0;
+}
+
 /**
  * Decode an intra frame.
  *
@@ -1871,10 +1915,9 @@ static int dirac_decode_frame(AVCodecCon
  */
 static int parse_frame(AVCodecContext *avctx) {
     DiracContext *s = avctx->priv_data;
-    int picnum;
     int retire;
     int filter;
-    int i;
+    int i, j, k;
     GetBitContext *gb = s->gb;
 
     /* Setup decoding parameter defaults for this frame.  */
@@ -1882,9 +1925,9 @@ static int parse_frame(AVCodecContext *a
 
     s->picture.pict_type = FF_I_TYPE;
     s->picture.key_frame = 1;
-    s->picture.reference = 0;
 
-    picnum = get_bits_long(gb, 32);
+    s->picnum = get_bits_long(gb, 32);
+    dprintf (avctx, "picnum = %d\n", s->picnum);
 
     if (s->refs) {
         s->ref1 = dirac_get_se_golomb(gb);
@@ -1892,10 +1935,52 @@ static int parse_frame(AVCodecContext *a
             s->ref2 = dirac_get_se_golomb(gb);
     }
 
+    dprintf(avctx, "Reference frames in the buffer:\n");
+    for (i = s->ref_first; i <= s->ref_last - 1; i = (i + 1) % REFFRAME_CNT) {
+        dprintf(avctx, "ref frame #%d\n", s->refframes[i].coded_picture_number);
+    }
+
     retire = dirac_get_ue_golomb(gb);
 
-    for (i = 0; i < retire; i++)
-        dirac_get_se_golomb(gb); /* XXX */
+    dprintf(avctx, "retire count=%d\n", retire);
+    for (k = 0; k < retire; k++) {
+        int retire;
+        retire = dirac_get_se_golomb(gb);
+        dprintf(0, "retire %d\n", retire);
+
+        dprintf(0, "RETIRE %d+%d=%d\n", retire, s->picnum, retire + s->picnum);
+
+        retire += s->picnum;
+
+
+        for (i = s->ref_first; i <= s->ref_last; i = (i + 1) % REFFRAME_CNT) {
+            AVFrame *f = &s->refframes[i];
+            if (f->coded_picture_number == retire) {
+                int j;
+
+                dprintf(avctx, "Retire frame #%d (%d)\n", retire, i);
+                for (j = i; j < s->ref_last; j++) {
+                    s->refframes[j] = s->refframes[j + 1];
+                }
+
+                dprintf(avctx, "Kill the buffer\n");
+                if (f->data[0] != NULL)
+                    avctx->release_buffer(avctx, f);
+
+                s->ref_last--;
+                if (s->ref_last < 0)
+                    s->ref_last = REFFRAME_CNT;
+
+                break;
+            }
+            if (i == s->ref_last-1)
+                dprintf(avctx, "Retire #%d not found\n", retire);
+        }
+    }
+
+    for (i = s->ref_first; i <= s->ref_last - 1; i = (i + 1) % REFFRAME_CNT) {
+        dprintf(avctx, ">ref frame #%d\n", s->refframes[i].coded_picture_number);
+    }
 
     if (s->refs) {
         align_get_bits(gb);
@@ -2040,8 +2125,16 @@ static int decode_frame(AVCodecContext *
     avcodec_set_dimensions(avctx, s->sequence.luma_width,
                            s->sequence.luma_height);
 
-    if (s->picture.data[0] != NULL)
-        avctx->release_buffer(avctx, &s->picture);
+    if (s->picture.data[0] != NULL) {
+        if (s->picture.reference)
+            avcodec_get_frame_defaults(&s->picture);
+        else
+            avctx->release_buffer(avctx, &s->picture);
+    }
+
+    dprintf(avctx, "reference frame #%d\n", s->picnum);
+
+    s->picture.reference = (parse_code & 0x04) == 0x04;
 
     if (avctx->get_buffer(avctx, &s->picture) < 0) {
         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
@@ -2051,6 +2144,13 @@ static int decode_frame(AVCodecContext *
     if (dirac_decode_frame(avctx))
         return -1;
 
+    s->picture.coded_picture_number = s->picnum;
+
+    if (s->picture.reference) {
+        s->refframes[s->ref_last++] = s->picture;
+        dprintf(avctx, "add reference frame #%d\n", s->picture.coded_picture_number);
+    }
+
     *data_size = sizeof(AVFrame);
     *picture = s->picture;
 



More information about the FFmpeg-soc mailing list