Commit b50eef3a authored by Michael Niedermayer's avatar Michael Niedermayer

grayscale only decoding

Originally committed as revision 677 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 800d7ceb
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
#define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION_INT 0x000406
#define LIBAVCODEC_VERSION "0.4.6" #define LIBAVCODEC_VERSION "0.4.6"
#define LIBAVCODEC_BUILD 4613 #define LIBAVCODEC_BUILD 4614
#define LIBAVCODEC_BUILD_STR "4613" #define LIBAVCODEC_BUILD_STR "4614"
enum CodecID { enum CodecID {
CODEC_ID_NONE, CODEC_ID_NONE,
...@@ -23,6 +23,7 @@ enum CodecID { ...@@ -23,6 +23,7 @@ enum CodecID {
CODEC_ID_MSMPEG4V2, CODEC_ID_MSMPEG4V2,
CODEC_ID_MSMPEG4V3, CODEC_ID_MSMPEG4V3,
CODEC_ID_WMV1, CODEC_ID_WMV1,
CODEC_ID_WMV2,
CODEC_ID_H263P, CODEC_ID_H263P,
CODEC_ID_H263I, CODEC_ID_H263I,
...@@ -97,6 +98,7 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, ...@@ -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_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_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_EXTERN_HUFF 0x1000 /* use external huffman table (for mjpeg) */
#define CODEC_FLAG_GRAY 0x2000 /* only decode/encode grayscale */
/* codec capabilities */ /* codec capabilities */
......
...@@ -124,6 +124,7 @@ uint64_t time= rdtsc(); ...@@ -124,6 +124,7 @@ uint64_t time= rdtsc();
s->hurry_up= avctx->hurry_up; s->hurry_up= avctx->hurry_up;
s->error_resilience= avctx->error_resilience; s->error_resilience= avctx->error_resilience;
s->workaround_bugs= avctx->workaround_bugs; s->workaround_bugs= avctx->workaround_bugs;
s->flags= avctx->flags;
/* no supplementary picture */ /* no supplementary picture */
if (buf_size == 0) { if (buf_size == 0) {
......
...@@ -155,10 +155,12 @@ int MPV_common_init(MpegEncContext *s) ...@@ -155,10 +155,12 @@ int MPV_common_init(MpegEncContext *s)
CHECKED_ALLOCZ(pict, c_size) CHECKED_ALLOCZ(pict, c_size)
s->last_picture_base[i] = pict; s->last_picture_base[i] = pict;
s->last_picture[i] = pict + pict_start; s->last_picture[i] = pict + pict_start;
if(i>0) memset(s->last_picture_base[i], 128, c_size);
CHECKED_ALLOCZ(pict, c_size) CHECKED_ALLOCZ(pict, c_size)
s->next_picture_base[i] = pict; s->next_picture_base[i] = pict;
s->next_picture[i] = pict + pict_start; 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) { 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 /* 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) ...@@ -166,6 +168,7 @@ int MPV_common_init(MpegEncContext *s)
CHECKED_ALLOCZ(pict, c_size) CHECKED_ALLOCZ(pict, c_size)
s->aux_picture_base[i] = pict; s->aux_picture_base[i] = pict;
s->aux_picture[i] = pict + pict_start; 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) ...@@ -886,6 +889,8 @@ if(s->quarter_sample)
pix_op[dxy](dest_y, ptr, linesize, h); pix_op[dxy](dest_y, ptr, linesize, h);
pix_op[dxy](dest_y + 8, ptr + 8, 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) { if (s->out_format == FMT_H263) {
dxy = 0; dxy = 0;
if ((motion_x & 3) != 0) if ((motion_x & 3) != 0)
...@@ -949,6 +954,8 @@ static inline void qpel_motion(MpegEncContext *s, ...@@ -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 , 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); 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); mx= (motion_x>>1) | (motion_x&1);
my= (motion_y>>1) | (motion_y&1); my= (motion_y>>1) | (motion_y&1);
...@@ -1037,6 +1044,8 @@ static inline void MPV_motion(MpegEncContext *s, ...@@ -1037,6 +1044,8 @@ static inline void MPV_motion(MpegEncContext *s,
dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize; dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
pix_op[dxy](dest, ptr, s->linesize, 8); 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 /* In case of 8X8, we construct a single chroma motion vector
with a special rounding */ with a special rounding */
mx = 0; mx = 0;
...@@ -1292,17 +1301,21 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) ...@@ -1292,17 +1301,21 @@ 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[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[3], 3, dest_y + dct_offset + 8, dct_linesize);
if(!(s->flags&CODEC_FLAG_GRAY)){
add_dequant_dct(s, block[4], 4, dest_cb, s->linesize >> 1); add_dequant_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
add_dequant_dct(s, block[5], 5, dest_cr, s->linesize >> 1); add_dequant_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
}
} else { } else {
add_dct(s, block[0], 0, dest_y, dct_linesize); 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[1], 1, dest_y + 8, dct_linesize);
add_dct(s, block[2], 2, dest_y + dct_offset, 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[3], 3, dest_y + dct_offset + 8, dct_linesize);
if(!(s->flags&CODEC_FLAG_GRAY)){
add_dct(s, block[4], 4, dest_cb, s->linesize >> 1); add_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
add_dct(s, block[5], 5, dest_cr, s->linesize >> 1); add_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
} }
}
} else { } else {
/* dct only in intra block */ /* dct only in intra block */
put_dct(s, block[0], 0, dest_y, dct_linesize); put_dct(s, block[0], 0, dest_y, dct_linesize);
...@@ -1310,10 +1323,12 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) ...@@ -1310,10 +1323,12 @@ 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[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[3], 3, dest_y + dct_offset + 8, dct_linesize);
if(!(s->flags&CODEC_FLAG_GRAY)){
put_dct(s, block[4], 4, dest_cb, s->linesize >> 1); put_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
put_dct(s, block[5], 5, dest_cr, s->linesize >> 1); put_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
} }
} }
}
the_end: the_end:
emms_c(); //FIXME remove emms_c(); //FIXME remove
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment