changeset 345:e05b357a398a libavcodec

export mbskip_table for direct rendering add hurry_up support
author michaelni
date Sat, 27 Apr 2002 13:12:57 +0000
parents 9f6071a87e17
children c2f789fe4945
files avcodec.h h263dec.c mpeg12.c mpegvideo.c mpegvideo.h
diffstat 5 files changed, 19 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Sat Apr 27 12:30:26 2002 +0000
+++ b/avcodec.h	Sat Apr 27 13:12:57 2002 +0000
@@ -5,8 +5,8 @@
 
 #define LIBAVCODEC_VERSION_INT 0x000406
 #define LIBAVCODEC_VERSION     "0.4.6"
-#define LIBAVCODEC_BUILD       4603
-#define LIBAVCODEC_BUILD_STR   "4603"
+#define LIBAVCODEC_BUILD       4604
+#define LIBAVCODEC_BUILD_STR   "4604"
 
 enum CodecID {
     CODEC_ID_NONE, 
@@ -141,6 +141,8 @@
     int key_frame;    /* true if the previous compressed frame was 
                          a key frame (intra, or seekable) */
     int delay;        /* number of frames the decoded output will be delayed relative to the encoded input */
+    uint8_t *mbskip_table; /* =1 if MB didnt change, is only valid for I/P frames 
+                              stride= mb_width = (width+15)>>4 */
     
     /* encoding parameters */
     int quality;      /* quality of the previous encoded frame 
@@ -157,6 +159,9 @@
     int rc_strategy;
     int b_frame_strategy;
 
+    int hurry_up;     /* when set to 1 during decoding, b frames will be skiped
+                         when set to 2 idct/dequant will be skipped too */
+    
     struct AVCodec *codec;
     void *priv_data;
 
--- a/h263dec.c	Sat Apr 27 12:30:26 2002 +0000
+++ b/h263dec.c	Sat Apr 27 13:12:57 2002 +0000
@@ -74,6 +74,7 @@
         return -1;
     }
     s->codec_id= avctx->codec->id;
+    avctx->mbskip_table= s->mbskip_table;
     
     /* for h263, we allocate the images after having read the header */
     if (avctx->codec->id != CODEC_ID_H263 && avctx->codec->id != CODEC_ID_MPEG4)
@@ -108,6 +109,8 @@
     printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
     printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]);
 #endif
+
+    s->hurry_up= avctx->hurry_up;
     
     /* no supplementary picture */
     if (buf_size == 0) {
@@ -154,6 +157,8 @@
         return -1;
     /* skip b frames if we dont have reference frames */
     if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return 0;
+    /* skip b frames if we are in a hurry */
+    if(s->hurry_up && s->pict_type==B_TYPE) return 0;
         
     MPV_frame_start(s);
 
--- a/mpeg12.c	Sat Apr 27 12:30:26 2002 +0000
+++ b/mpeg12.c	Sat Apr 27 13:12:57 2002 +0000
@@ -1187,6 +1187,7 @@
     s->mpeg_enc_ctx.picture_number = 0;
     s->repeat_field = 0;
     s->mpeg_enc_ctx.codec_id= avctx->codec->id;
+    avctx->mbskip_table= s->mpeg_enc_ctx.mbskip_table;
     return 0;
 }
 
--- a/mpegvideo.c	Sat Apr 27 12:30:26 2002 +0000
+++ b/mpegvideo.c	Sat Apr 27 13:12:57 2002 +0000
@@ -1145,6 +1145,9 @@
 static inline void add_dct(MpegEncContext *s, 
                            DCTELEM *block, int i, UINT8 *dest, int line_size)
 {
+    /* skip dequant / idct if we are really late ;) */
+    if(s->hurry_up>1) return;
+
     if (s->block_last_index[i] >= 0) {
         if (!s->mpeg2)
             if(s->encoding || (!s->h263_msmpeg4))
--- a/mpegvideo.h	Sat Apr 27 12:30:26 2002 +0000
+++ b/mpegvideo.h	Sat Apr 27 13:12:57 2002 +0000
@@ -196,6 +196,9 @@
     int no_rounding; /* apply no rounding to motion compensation (MPEG4, msmpeg4, ...) 
                         for b-frames rounding mode is allways 0 */
 
+    int hurry_up;     /* when set to 1 during decoding, b frames will be skiped
+                         when set to 2 idct/dequant will be skipped too */
+
     /* macroblock layer */
     int mb_x, mb_y;
     int mb_incr;