From b50eef3ae0528bbfa36421a2dd471d80986322d5 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 9 Jun 2002 13:35:56 +0000 Subject: [PATCH] grayscale only decoding Originally committed as revision 677 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/avcodec.h | 6 ++++-- libavcodec/h263dec.c | 1 + libavcodec/mpegvideo.c | 27 +++++++++++++++++++++------ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 5442ede009..68b67154d7 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -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 */ diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index 6616a0e37b..3c90a1e470 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -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) { diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 32aa2e1362..0cb63d45c8 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -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: