summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/dsputil.c18
-rw-r--r--libavcodec/dsputil.h1
-rw-r--r--libavcodec/jrevdct.c4
3 files changed, 23 insertions, 0 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index 9bf409d65e..3db04c00a7 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -3382,6 +3382,19 @@ static void ff_jref_idct2_add(uint8_t *dest, int line_size, DCTELEM *block)
add_pixels_clamped2_c(block, dest, line_size);
}
+static void ff_jref_idct1_put(uint8_t *dest, int line_size, DCTELEM *block)
+{
+ uint8_t *cm = cropTbl + MAX_NEG_CROP;
+
+ dest[0] = cm[(block[0] + 4)>>3];
+}
+static void ff_jref_idct1_add(uint8_t *dest, int line_size, DCTELEM *block)
+{
+ uint8_t *cm = cropTbl + MAX_NEG_CROP;
+
+ dest[0] = cm[dest[0] + ((block[0] + 4)>>3)];
+}
+
/* init static data */
void dsputil_static_init(void)
{
@@ -3430,6 +3443,11 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx)
c->idct_add= ff_jref_idct2_add;
c->idct = j_rev_dct2;
c->idct_permutation_type= FF_NO_IDCT_PERM;
+ }else if(avctx->lowres==3){
+ c->idct_put= ff_jref_idct1_put;
+ c->idct_add= ff_jref_idct1_add;
+ c->idct = j_rev_dct1;
+ c->idct_permutation_type= FF_NO_IDCT_PERM;
}else{
if(avctx->idct_algo==FF_IDCT_INT){
c->idct_put= ff_jref_idct_put;
diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h
index 15f0b6e2a2..fd02e4e035 100644
--- a/libavcodec/dsputil.h
+++ b/libavcodec/dsputil.h
@@ -44,6 +44,7 @@ void ff_fdct248_islow (DCTELEM *data);
void j_rev_dct (DCTELEM *data);
void j_rev_dct4 (DCTELEM *data);
void j_rev_dct2 (DCTELEM *data);
+void j_rev_dct1 (DCTELEM *data);
void ff_fdct_mmx(DCTELEM *block);
void ff_fdct_mmx2(DCTELEM *block);
diff --git a/libavcodec/jrevdct.c b/libavcodec/jrevdct.c
index 8bc0d1657d..72412fdc14 100644
--- a/libavcodec/jrevdct.c
+++ b/libavcodec/jrevdct.c
@@ -1640,5 +1640,9 @@ void j_rev_dct2(DCTBLOCK data){
data[1+1*DCTSTRIDE]= (d01 - d11)>>3;
}
+void j_rev_dct1(DCTBLOCK data){
+ data[0] = (data[0] + 4)>>3;
+}
+
#undef FIX
#undef CONST_BITS