]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/rv40.c
Fix rc_eq mem leak.
[ffmpeg] / libavcodec / rv40.c
index 642386c380897ca79c4dd5df1d9cc1627c5b3137..2d529677a693208bdcf84bc033e1a1bdbb17614d 100644 (file)
@@ -27,6 +27,7 @@
 #include "avcodec.h"
 #include "dsputil.h"
 #include "mpegvideo.h"
+#include "golomb.h"
 
 #include "rv34.h"
 #include "rv40vlc2.h"
@@ -39,7 +40,7 @@ static VLC ptype_vlc[NUM_PTYPE_VLCS], btype_vlc[NUM_BTYPE_VLCS];
 /**
  * Initialize all tables.
  */
-static void rv40_init_tables()
+static av_cold void rv40_init_tables()
 {
     int i;
 
@@ -102,7 +103,7 @@ static void rv40_parse_picture_size(GetBitContext *gb, int *w, int *h)
 
 static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
 {
-    int t, mb_bits;
+    int mb_bits;
     int w = r->s.width, h = r->s.height;
     int mb_size;
 
@@ -116,9 +117,11 @@ static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceIn
         return -1;
     si->vlc_set = get_bits(gb, 2);
     skip_bits1(gb);
-    t = get_bits(gb, 13); /// ???
+    si->pts = get_bits(gb, 13);
     if(!si->type || !get_bits1(gb))
         rv40_parse_picture_size(gb, &w, &h);
+    if(avcodec_check_dimensions(r->s.avctx, w, h) < 0)
+        return -1;
     si->width  = w;
     si->height = h;
     mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
@@ -205,18 +208,18 @@ static int rv40_decode_mb_info(RV34DecContext *r)
     int count = 0;
 
     if(!r->s.mb_skip_run)
-        r->s.mb_skip_run = ff_rv34_get_gamma(gb);
+        r->s.mb_skip_run = svq3_get_ue_golomb(gb) + 1;
 
     if(--r->s.mb_skip_run)
          return RV34_MB_SKIP;
 
-    if(r->avail[0])
+    if(r->avail_cache[5-1])
         blocks[r->mb_type[mb_pos - 1]]++;
-    if(r->avail[1]){
+    if(r->avail_cache[5-4]){
         blocks[r->mb_type[mb_pos - s->mb_stride]]++;
-        if(r->avail[2])
+        if(r->avail_cache[5-2])
             blocks[r->mb_type[mb_pos - s->mb_stride + 1]]++;
-        if(r->avail[3])
+        if(r->avail_cache[5-5])
             blocks[r->mb_type[mb_pos - s->mb_stride - 1]]++;
     }
 
@@ -226,7 +229,7 @@ static int rv40_decode_mb_info(RV34DecContext *r)
             prev_type = i;
         }
     }
-    if(s->pict_type == P_TYPE){
+    if(s->pict_type == FF_P_TYPE){
         prev_type = block_num_to_ptype_vlc_num[prev_type];
         q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
         if(q < PBTYPE_ESCAPE)
@@ -247,7 +250,7 @@ static int rv40_decode_mb_info(RV34DecContext *r)
 /**
  * Initialize decoder.
  */
-static int rv40_decode_init(AVCodecContext *avctx)
+static av_cold int rv40_decode_init(AVCodecContext *avctx)
 {
     RV34DecContext *r = avctx->priv_data;
 
@@ -273,4 +276,5 @@ AVCodec rv40_decoder = {
     ff_rv34_decode_end,
     ff_rv34_decode_frame,
     CODEC_CAP_DR1 | CODEC_CAP_DELAY,
+    .long_name = NULL_IF_CONFIG_SMALL("RealVideo 4.0"),
 };