grayscale only decoding
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 9 Jun 2002 13:35:56 +0000 (13:35 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 9 Jun 2002 13:35:56 +0000 (13:35 +0000)
Originally committed as revision 677 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/h263dec.c
libavcodec/mpegvideo.c

index 5442ede009ae4a6c381807fe5f104d0bda984d22..68b67154d786ba0b875a4c3e2eaf170fa965e05d 100644 (file)
@@ -5,8 +5,8 @@
 
 #define LIBAVCODEC_VERSION_INT 0x000406
 #define LIBAVCODEC_VERSION     "0.4.6"
-#define LIBAVCODEC_BUILD       4613
-#define LIBAVCODEC_BUILD_STR   "4613"
+#define LIBAVCODEC_BUILD       4614
+#define LIBAVCODEC_BUILD_STR   "4614"
 
 enum CodecID {
     CODEC_ID_NONE, 
@@ -23,6 +23,7 @@ enum CodecID {
     CODEC_ID_MSMPEG4V2,
     CODEC_ID_MSMPEG4V3,
     CODEC_ID_WMV1,
+    CODEC_ID_WMV2,
     CODEC_ID_H263P,
     CODEC_ID_H263I,
 
@@ -97,6 +98,7 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG,
 #define CODEC_FLAG_PASS1 0x0200  /* use internal 2pass ratecontrol in first  pass mode */
 #define CODEC_FLAG_PASS2 0x0400  /* use internal 2pass ratecontrol in second pass mode */
 #define CODEC_FLAG_EXTERN_HUFF 0x1000 /* use external huffman table (for mjpeg) */
+#define CODEC_FLAG_GRAY  0x2000 /* only decode/encode grayscale */
 
 /* codec capabilities */
 
index 6616a0e37b4bf90d4767235910692f6ddef6b632..3c90a1e4709beb0f23143e4d93baf967e6727fe9 100644 (file)
@@ -124,6 +124,7 @@ uint64_t time= rdtsc();
     s->hurry_up= avctx->hurry_up;
     s->error_resilience= avctx->error_resilience;
     s->workaround_bugs= avctx->workaround_bugs;
+    s->flags= avctx->flags;
 
     /* no supplementary picture */
     if (buf_size == 0) {
index 32aa2e136224314272851a1c49644b876f8174a1..0cb63d45c8335e6e9c2d79973404de8f3946bec0 100644 (file)
@@ -155,10 +155,12 @@ int MPV_common_init(MpegEncContext *s)
         CHECKED_ALLOCZ(pict, c_size)
         s->last_picture_base[i] = pict;
         s->last_picture[i] = pict + pict_start;
+        if(i>0) memset(s->last_picture_base[i], 128, c_size);
     
         CHECKED_ALLOCZ(pict, c_size)
         s->next_picture_base[i] = pict;
         s->next_picture[i] = pict + pict_start;
+        if(i>0) memset(s->next_picture_base[i], 128, c_size);
         
         if (s->has_b_frames || s->codec_id==CODEC_ID_MPEG4) {
         /* Note the MPEG4 stuff is here cuz of buggy encoders which dont set the low_delay flag but 
@@ -166,6 +168,7 @@ int MPV_common_init(MpegEncContext *s)
             CHECKED_ALLOCZ(pict, c_size)
             s->aux_picture_base[i] = pict;
             s->aux_picture[i] = pict + pict_start;
+            if(i>0) memset(s->aux_picture_base[i], 128, c_size);
         }
     }
     
@@ -886,6 +889,8 @@ if(s->quarter_sample)
     pix_op[dxy](dest_y, ptr, linesize, h);
     pix_op[dxy](dest_y + 8, ptr + 8, linesize, h);
 
+    if(s->flags&CODEC_FLAG_GRAY) return;
+
     if (s->out_format == FMT_H263) {
         dxy = 0;
         if ((motion_x & 3) != 0)
@@ -949,6 +954,8 @@ static inline void qpel_motion(MpegEncContext *s,
     qpix_op[dxy](dest_y + linesize*8    , ptr + linesize*8    , linesize, linesize, motion_x&3, motion_y&3);
     qpix_op[dxy](dest_y + linesize*8 + 8, ptr + linesize*8 + 8, linesize, linesize, motion_x&3, motion_y&3);
     
+    if(s->flags&CODEC_FLAG_GRAY) return;
+
     mx= (motion_x>>1) | (motion_x&1);
     my= (motion_y>>1) | (motion_y&1);
 
@@ -1037,6 +1044,8 @@ static inline void MPV_motion(MpegEncContext *s,
             dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
             pix_op[dxy](dest, ptr, s->linesize, 8);
         }
+    
+        if(s->flags&CODEC_FLAG_GRAY) break;
         /* In case of 8X8, we construct a single chroma motion vector
            with a special rounding */
         mx = 0;
@@ -1292,16 +1301,20 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
                 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
                 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
 
-                add_dequant_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
-                add_dequant_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
+                if(!(s->flags&CODEC_FLAG_GRAY)){
+                    add_dequant_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
+                    add_dequant_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
+                }
             } else {
                 add_dct(s, block[0], 0, dest_y, dct_linesize);
                 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
                 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
                 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
 
-                add_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
-                add_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
+                if(!(s->flags&CODEC_FLAG_GRAY)){
+                    add_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
+                    add_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
+                }
             }
         } else {
             /* dct only in intra block */
@@ -1310,8 +1323,10 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
             put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
             put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
 
-            put_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
-            put_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
+            if(!(s->flags&CODEC_FLAG_GRAY)){
+                put_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
+                put_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
+            }
         }
     }
  the_end: