From f67b5939ad92e608b546b291b29bca1db3b54772 Mon Sep 17 00:00:00 2001 From: Pascal Massimino Date: Wed, 17 Nov 2010 20:06:01 -0800 Subject: [PATCH] lot of cosmetics just flushing the pile: - get rid of Put4 in dsp.c - move LD4 enum value - move more fields and code under the ONLY_KEYFRAME_CODE compile flag - update test_ref.ppm reference (now with FANCY_UPSCALER) - simplify VP8GetSignedValue() - use HE and VE naming for prediction mode instead of H and V - some missing c89 fixes - code style nits all test vectors still passing --- examples/test_ref.ppm | Bin 49167 -> 49167 bytes src/bits.c | 2 +- src/dsp.c | 57 ++++++++++++++++++--------------------- src/tree.c | 60 ++++++++++++++++++++++++------------------ src/vp8.c | 8 ++++-- src/vp8i.h | 27 +++++++++---------- 6 files changed, 78 insertions(+), 76 deletions(-) diff --git a/examples/test_ref.ppm b/examples/test_ref.ppm index 29bf07ffe845c044d9df3fe29492895876d313f2..97719f01f0e94bbf9a5b1aafe8a6d0ae7ff0e33d 100644 GIT binary patch delta 23339 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%0D2fnr==p5DFKmHE;D@HdW&}#(2Jz07Ue6n{ z9#eP~@_RnBxH>r5Ltw7%F0?mW%yS#qozXHi1%XEw#G` zv65m6C!q{cCP_?dYqXX4P(m~DraG~SNb_1*+Nr; z7Npmftq$9F(7Smt?QlIGKQ8Yj`1P&*trs*aSIX2H1`_HXe7OUa`87AxFbI`#Fs-GF zs|N?zZcI~nnH>oorr;A{v@iT41qnhHP?sPmRNAm%`^HV%I6&CkzxG|RhZS`F($DR8 zIBdsSYa{Gnw}t+Z`YYP+Y*{|QQ1uKN%fwk|_!?_Bx z1Jci(2tGdHgq#W=;w6run*b4X6IL$`u61@nL-0t-&_coz2>RdwiXV67(SdKF4|>w` z0Akt@n?9m{1_q;ltA>Bj2me5XG|FCHGR(&csuOf*8*zZ}4kwqj>o#xQ;cU0faiiUi zbsM)L_Gw^LT9|^hTnt}|MuB$UC@MMunPr%4($vE zq9NWEWAEdQ+Ta%?avsb9q_{CKNMj7vi+G34HVj37#pXt2U#L>7JIE}R9Tp0i#E{ma%E4JcS)C7HCQ1BaG?aha%FM1A~ z;!Y+=W`CPwPz^j19G?Ba0uN6gYc7d>rO21M0D~zAPh*5IFdY3`*uj14w#^O>lxmkP zcJ}MnZ`-hOD;Gsmx-0S0)*$25wd=Ov&<&gI*L-briLAdW`x zc_4^XGlX_RoUOfm@i||_k#f5JX5aRGd&caqhSQy{-p077gfN2BuoWRN-j@T-=@AM_`{PVjfCF;^xn;Y}zW=3_+T6~Va#3{xmS2wwQh@LQSd`|RfJmj*3h8^dt@ifR=~mc0~lLN2<2Q(!kih6AWwxR;n?3PlEW!8a!bdNvLP6fgnc zW<C`U;raLFlB#muuGJ8X`-%fz|}w)W;SUA^tYonCxsI;aAuICZT1p44Y#r z8lyL8rq`nDW7lHM4-{npb;20V%ylu?>KZDK?_1lxTDRlt_4cA{z}ju_CkX)Q;IAK| z4TLBxOgVkSEoV7(gYQGBoDS}z*r7M&6Pg45J9fA^IeGE9xMvR8XYabJxV3-d{|j%Vj;#Oy delta 22592 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 diff --git a/src/bits.c b/src/bits.c index bdc89e04..1d369389 100644 --- a/src/bits.c +++ b/src/bits.c @@ -67,7 +67,7 @@ uint32_t VP8GetValue(VP8BitReader* const br, int bits) { } int32_t VP8GetSignedValue(VP8BitReader* const br, int bits) { - const int value = (bits > 0) ? VP8GetValue(br, bits) : 0; + const int value = VP8GetValue(br, bits); return VP8Get(br) ? -value : value; } diff --git a/src/dsp.c b/src/dsp.c index 420b3b01..229d921f 100644 --- a/src/dsp.c +++ b/src/dsp.c @@ -170,32 +170,32 @@ void (*VP8TransformWHT)(const int16_t* in, int16_t* out) = TransformWHT; static inline void TrueMotion(uint8_t *dst, int size) { const uint8_t* top = dst - BPS; - const int tl = top[-1]; - int x, y; - + const uint8_t* const clip0 = clip1 + 255 - top[-1]; + int y; for (y = 0; y < size; ++y) { - const uint8_t* const clip = clip1 + 255 + dst[-1] - tl; + const uint8_t* const clip = clip0 + dst[-1]; + int x; for (x = 0; x < size; ++x) { dst[x] = clip[top[x]]; } dst += BPS; } } -static void TM4(uint8_t *dst) { TrueMotion(dst, 4); } +static void TM4(uint8_t *dst) { TrueMotion(dst, 4); } static void TM8uv(uint8_t *dst) { TrueMotion(dst, 8); } -static void TM16(uint8_t *dst) { TrueMotion(dst, 16); } +static void TM16(uint8_t *dst) { TrueMotion(dst, 16); } //----------------------------------------------------------------------------- // 16x16 -static void V16(uint8_t *dst) { // vertical +static void VE16(uint8_t *dst) { // vertical int j; for (j = 0; j < 16; ++j) { memcpy(dst + j * BPS, dst - BPS, 16); } } -static void H16(uint8_t *dst) { // horizontal +static void HE16(uint8_t *dst) { // horizontal int j; for (j = 16; j > 0; --j) { memset(dst, dst[-1], 16); @@ -244,30 +244,24 @@ static void DC16NoTopLeft(uint8_t *dst) { // DC with no top and left samples //----------------------------------------------------------------------------- // 4x4 -static inline void Put4(uint32_t v, uint8_t* dst) { - int i; - for (i = 4; i > 0; --i) { - *(uint32_t*)dst = v; - dst += BPS; - } -} - #define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2) #define AVG2(a, b) (((a) + (b) + 1) >> 1) -static void V4(uint8_t *dst) { // vertical +static void VE4(uint8_t *dst) { // vertical const uint8_t* top = dst - BPS; const uint8_t vals[4] = { AVG3(top[-1], top[0], top[1]), - AVG3(top[0], top[1], top[2]), - AVG3(top[1], top[2], top[3]), - AVG3(top[2], top[3], top[4]) + AVG3(top[ 0], top[1], top[2]), + AVG3(top[ 1], top[2], top[3]), + AVG3(top[ 2], top[3], top[4]) }; - const uint32_t v = *(uint32_t*)vals; - Put4(v, dst); + int i; + for (i = 0; i < 4; ++i) { + memcpy(dst + i * BPS, vals, sizeof(vals)); + } } -static void H4(uint8_t *dst) { // horizontal +static void HE4(uint8_t *dst) { // horizontal const int A = dst[-1 - BPS]; const int B = dst[-1]; const int C = dst[-1 + BPS]; @@ -282,10 +276,9 @@ static void H4(uint8_t *dst) { // horizontal static void DC4(uint8_t *dst) { // DC uint32_t dc = 4; int i; - for (i = 0; i < 4; ++i) { - dc += dst[i - BPS] + dst[-1 + i * BPS]; - } - Put4((dc >> 3) * 0x01010101U, dst); + for (i = 0; i < 4; ++i) dc += dst[i - BPS] + dst[-1 + i * BPS]; + dc >>= 3; + for (i = 0; i < 4; ++i) memset(dst + i * BPS, dc, 4); } static void RD4(uint8_t *dst) { // Down-right @@ -413,14 +406,14 @@ static void HD4(uint8_t *dst) { // Horizontal-Down //----------------------------------------------------------------------------- // Chroma -static void V8uv(uint8_t *dst) { // vertical +static void VE8uv(uint8_t *dst) { // vertical int j; for (j = 0; j < 8; ++j) { memcpy(dst + j * BPS, dst - BPS, 8); } } -static void H8uv(uint8_t *dst) { // horizontal +static void HE8uv(uint8_t *dst) { // horizontal int j; for (j = 0; j < 8; ++j) { memset(dst, dst[-1], 8); @@ -471,16 +464,16 @@ static void DC8uvNoTopLeft(uint8_t *dst) { // DC with nothing // default C implementations VP8PredFunc VP8PredLuma4[11] = { - DC4, TM4, V4, H4, LD4, RD4, VR4, VL4, HD4, HU4 + DC4, TM4, VE4, HE4, RD4, VR4, LD4, VL4, HD4, HU4 }; VP8PredFunc VP8PredLuma16[7] = { - DC16, TM16, V16, H16, + DC16, TM16, VE16, HE16, DC16NoTop, DC16NoLeft, DC16NoTopLeft }; VP8PredFunc VP8PredChroma8[7] = { - DC8uv, TM8uv, V8uv, H8uv, + DC8uv, TM8uv, VE8uv, HE8uv, DC8uvNoTop, DC8uvNoLeft, DC8uvNoTopLeft }; diff --git a/src/tree.c b/src/tree.c index 1d5c422e..03cb745c 100644 --- a/src/tree.c +++ b/src/tree.c @@ -11,6 +11,7 @@ #include #include "vp8i.h" + #define USE_GENERIC_TREE #if defined(__cplusplus) || defined(c_plusplus) @@ -32,6 +33,12 @@ static const int8_t kYModesIntra4[18] = { #endif #ifndef ONLY_KEYFRAME_CODE + +// inter prediction modes +enum { + LEFT4 = 0, ABOVE4 = 1, ZERO4 = 2, NEW4 = 3, + NEARESTMV, NEARMV, ZEROMV, NEWMV, SPLITMV }; + static const int8_t kYModesInter[8] = { -DC_PRED, 1, 2, 3, @@ -216,14 +223,13 @@ static const uint8_t // Paragraph 11.5 static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { - // genereated using vp8_kf_default_bmode_probs() { { 231, 120, 48, 89, 115, 113, 120, 152, 112 }, { 152, 179, 64, 126, 170, 118, 46, 70, 95 }, { 175, 69, 143, 80, 85, 82, 72, 155, 103 }, { 56, 58, 10, 171, 218, 189, 17, 13, 152 }, - { 144, 71, 10, 38, 171, 213, 144, 34, 26 }, { 114, 26, 17, 163, 44, 195, 21, 10, 173 }, { 121, 24, 80, 195, 26, 62, 44, 64, 85 }, + { 144, 71, 10, 38, 171, 213, 144, 34, 26 }, { 170, 46, 55, 19, 136, 160, 33, 206, 71 }, { 63, 20, 8, 114, 114, 208, 12, 9, 226 }, { 81, 40, 11, 96, 182, 84, 29, 16, 36 } }, @@ -231,9 +237,9 @@ static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { { 72, 187, 100, 130, 157, 111, 32, 75, 80 }, { 66, 102, 167, 99, 74, 62, 40, 234, 128 }, { 41, 53, 9, 178, 241, 141, 26, 8, 107 }, - { 104, 79, 12, 27, 217, 255, 87, 17, 7 }, { 74, 43, 26, 146, 73, 166, 49, 23, 157 }, { 65, 38, 105, 160, 51, 52, 31, 115, 128 }, + { 104, 79, 12, 27, 217, 255, 87, 17, 7 }, { 87, 68, 71, 44, 114, 51, 15, 186, 23 }, { 47, 41, 14, 110, 182, 183, 21, 17, 194 }, { 66, 45, 25, 102, 197, 189, 23, 18, 22 } }, @@ -241,9 +247,9 @@ static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { { 43, 97, 183, 117, 85, 38, 35, 179, 61 }, { 39, 53, 200, 87, 26, 21, 43, 232, 171 }, { 56, 34, 51, 104, 114, 102, 29, 93, 77 }, - { 107, 54, 32, 26, 51, 1, 81, 43, 31 }, { 39, 28, 85, 171, 58, 165, 90, 98, 64 }, { 34, 22, 116, 206, 23, 34, 43, 166, 73 }, + { 107, 54, 32, 26, 51, 1, 81, 43, 31 }, { 68, 25, 106, 22, 64, 171, 36, 225, 114 }, { 34, 19, 21, 102, 132, 188, 16, 76, 124 }, { 62, 18, 78, 95, 85, 57, 50, 48, 51 } }, @@ -251,29 +257,19 @@ static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { { 60, 148, 31, 172, 219, 228, 21, 18, 111 }, { 112, 113, 77, 85, 179, 255, 38, 120, 114 }, { 40, 42, 1, 196, 245, 209, 10, 25, 109 }, - { 100, 80, 8, 43, 154, 1, 51, 26, 71 }, { 88, 43, 29, 140, 166, 213, 37, 43, 154 }, { 61, 63, 30, 155, 67, 45, 68, 1, 209 }, + { 100, 80, 8, 43, 154, 1, 51, 26, 71 }, { 142, 78, 78, 16, 255, 128, 34, 197, 171 }, { 41, 40, 5, 102, 211, 183, 4, 1, 221 }, { 51, 50, 17, 168, 209, 192, 23, 25, 82 } }, - { { 125, 98, 42, 88, 104, 85, 117, 175, 82 }, - { 95, 84, 53, 89, 128, 100, 113, 101, 45 }, - { 75, 79, 123, 47, 51, 128, 81, 171, 1 }, - { 57, 17, 5, 71, 102, 57, 53, 41, 49 }, - { 115, 21, 2, 10, 102, 255, 166, 23, 6 }, - { 38, 33, 13, 121, 57, 73, 26, 1, 85 }, - { 41, 10, 67, 138, 77, 110, 90, 47, 114 }, - { 101, 29, 16, 10, 85, 128, 101, 196, 26 }, - { 57, 18, 10, 102, 102, 213, 34, 20, 43 }, - { 117, 20, 15, 36, 163, 128, 68, 1, 26 } }, { { 138, 31, 36, 171, 27, 166, 38, 44, 229 }, { 67, 87, 58, 169, 82, 115, 26, 59, 179 }, { 63, 59, 90, 180, 59, 166, 93, 73, 154 }, { 40, 40, 21, 116, 143, 209, 34, 39, 175 }, - { 57, 46, 22, 24, 128, 1, 54, 17, 37 }, { 47, 15, 16, 183, 34, 223, 49, 45, 183 }, { 46, 17, 33, 183, 6, 98, 15, 32, 183 }, + { 57, 46, 22, 24, 128, 1, 54, 17, 37 }, { 65, 32, 73, 115, 28, 128, 23, 128, 205 }, { 40, 3, 9, 115, 51, 192, 18, 6, 223 }, { 87, 37, 9, 115, 59, 77, 64, 21, 47 } }, @@ -281,19 +277,29 @@ static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { { 64, 90, 70, 205, 40, 41, 23, 26, 57 }, { 54, 57, 112, 184, 5, 41, 38, 166, 213 }, { 30, 34, 26, 133, 152, 116, 10, 32, 134 }, - { 75, 32, 12, 51, 192, 255, 160, 43, 51 }, { 39, 19, 53, 221, 26, 114, 32, 73, 255 }, { 31, 9, 65, 234, 2, 15, 1, 118, 73 }, + { 75, 32, 12, 51, 192, 255, 160, 43, 51 }, { 88, 31, 35, 67, 102, 85, 55, 186, 85 }, { 56, 21, 23, 111, 59, 205, 45, 37, 192 }, { 55, 38, 70, 124, 73, 102, 1, 34, 98 } }, + { { 125, 98, 42, 88, 104, 85, 117, 175, 82 }, + { 95, 84, 53, 89, 128, 100, 113, 101, 45 }, + { 75, 79, 123, 47, 51, 128, 81, 171, 1 }, + { 57, 17, 5, 71, 102, 57, 53, 41, 49 }, + { 38, 33, 13, 121, 57, 73, 26, 1, 85 }, + { 41, 10, 67, 138, 77, 110, 90, 47, 114 }, + { 115, 21, 2, 10, 102, 255, 166, 23, 6 }, + { 101, 29, 16, 10, 85, 128, 101, 196, 26 }, + { 57, 18, 10, 102, 102, 213, 34, 20, 43 }, + { 117, 20, 15, 36, 163, 128, 68, 1, 26 } }, { { 102, 61, 71, 37, 34, 53, 31, 243, 192 }, { 69, 60, 71, 38, 73, 119, 28, 222, 37 }, { 68, 45, 128, 34, 1, 47, 11, 245, 171 }, { 62, 17, 19, 70, 146, 85, 55, 62, 70 }, - { 75, 15, 9, 9, 64, 255, 184, 119, 16 }, { 37, 43, 37, 154, 100, 163, 85, 160, 1 }, { 63, 9, 92, 136, 28, 64, 32, 201, 85 }, + { 75, 15, 9, 9, 64, 255, 184, 119, 16 }, { 86, 6, 28, 5, 64, 255, 25, 248, 1 }, { 56, 8, 17, 132, 137, 255, 55, 116, 128 }, { 58, 15, 20, 82, 135, 57, 26, 121, 40 } }, @@ -301,9 +307,9 @@ static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { { 51, 103, 44, 131, 131, 123, 31, 6, 158 }, { 86, 40, 64, 135, 148, 224, 45, 183, 128 }, { 22, 26, 17, 131, 240, 154, 14, 1, 209 }, - { 83, 12, 13, 54, 192, 255, 68, 47, 28 }, { 45, 16, 21, 91, 64, 222, 7, 1, 197 }, { 56, 21, 39, 155, 60, 138, 23, 102, 213 }, + { 83, 12, 13, 54, 192, 255, 68, 47, 28 }, { 85, 26, 85, 85, 128, 128, 32, 146, 171 }, { 18, 11, 7, 63, 144, 171, 4, 4, 246 }, { 35, 27, 10, 146, 174, 171, 12, 26, 128 } }, @@ -311,9 +317,9 @@ static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { { 85, 126, 47, 87, 176, 51, 41, 20, 32 }, { 101, 75, 128, 139, 118, 146, 116, 128, 85 }, { 56, 41, 15, 176, 236, 85, 37, 9, 62 }, - { 146, 36, 19, 30, 171, 255, 97, 27, 20 }, { 71, 30, 17, 119, 118, 255, 17, 18, 138 }, { 101, 38, 60, 138, 55, 70, 43, 26, 142 }, + { 146, 36, 19, 30, 171, 255, 97, 27, 20 }, { 138, 45, 61, 62, 219, 1, 81, 188, 64 }, { 32, 41, 20, 117, 151, 142, 20, 21, 163 }, { 112, 19, 12, 61, 195, 128, 48, 4, 24 } } @@ -551,25 +557,27 @@ void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) { } #ifndef ONLY_KEYFRAME_CODE if (!dec->frm_hdr_.key_frame_) { + int i; dec->intra_p_ = VP8GetValue(br, 8); dec->last_p_ = VP8GetValue(br, 8); dec->golden_p_ = VP8GetValue(br, 8); if (VP8Get(br)) { // update y-mode - for (int i = 0; i < 4; ++i) { + for (i = 0; i < 4; ++i) { proba->ymode_[i] = VP8GetValue(br, 8); } } if (VP8Get(br)) { // update uv-mode - for (int i = 0; i < 3; ++i) { + for (i = 0; i < 3; ++i) { proba->uvmode_[i] = VP8GetValue(br, 8); } } // update MV - for (int d = 0; d < 2; ++d) { - for (int k = 0; k < NUM_MV_PROBAS; ++k) { - if (VP8GetBit(br, MVUpdateProba[d][k])) { + for (i = 0; i < 2; ++i) { + int k; + for (k = 0; k < NUM_MV_PROBAS; ++k) { + if (VP8GetBit(br, MVUpdateProba[i][k])) { const int v = VP8GetValue(br, 7); - proba->mv_[d][k] = v ? v << 1 : 1; + proba->mv_[i][k] = v ? v << 1 : 1; } } } diff --git a/src/vp8.c b/src/vp8.c index 58241925..f1455399 100644 --- a/src/vp8.c +++ b/src/vp8.c @@ -302,15 +302,16 @@ int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io) { } // Paragraph 9.8 +#ifndef ONLY_KEYFRAME_CODE dec->update_proba_ = VP8Get(br); if (!dec->update_proba_) { // save for later restore dec->proba_saved_ = dec->proba_; } - -#ifndef ONLY_KEYFRAME_CODE dec->buffer_flags_ &= 1 << 8; dec->buffer_flags_ |= (frm_hdr->key_frame_ || VP8Get(br)) << 8; // refresh last frame +#else + VP8Get(br); // just ignore the value of update_proba_ #endif VP8ParseProba(br, dec); @@ -555,9 +556,12 @@ static int ParseFrame(VP8Decoder* const dec, VP8Io* io) { } // Finish +#ifndef ONLY_KEYFRAME_CODE if (!dec->update_proba_) { dec->proba_ = dec->proba_saved_; } +#endif + return ok; } diff --git a/src/vp8i.h b/src/vp8i.h index 15a21ee8..76985b8a 100644 --- a/src/vp8i.h +++ b/src/vp8i.h @@ -29,9 +29,9 @@ enum { B_DC_PRED = 0, // 4x4 modes B_TM_PRED, B_VE_PRED, B_HE_PRED, - B_LD_PRED, B_RD_PRED, B_VR_PRED, + B_LD_PRED, B_VL_PRED, B_HD_PRED, B_HU_PRED, @@ -47,13 +47,6 @@ enum { B_DC_PRED = 0, // 4x4 modes B_DC_PRED_NOLEFT = 5, B_DC_PRED_NOTOPLEFT = 6 }; -#ifndef ONLY_KEYFRAME_CODE -// inter prediction modes -enum { - LEFT4 = 0, ABOVE4 = 1, ZERO4 = 2, NEW4 = 3, - NEARESTMV, NEARMV, ZEROMV, NEWMV, SPLITMV }; -#endif - enum { MB_FEATURE_TREE_PROBS = 3, NUM_MB_SEGMENTS = 4, NUM_REF_LF_DELTAS = 4, @@ -177,10 +170,10 @@ struct VP8Decoder { VP8BitReader br_; // headers - VP8FrameHeader frm_hdr_; - VP8PictureHeader pic_hdr_; - VP8FilterHeader filter_hdr_; - VP8SegmentHeader segment_hdr_; + VP8FrameHeader frm_hdr_; + VP8PictureHeader pic_hdr_; + VP8FilterHeader filter_hdr_; + VP8SegmentHeader segment_hdr_; // dimension, in macroblock units. int mb_w_, mb_h_; @@ -201,10 +194,14 @@ struct VP8Decoder { VP8QuantMatrix dqm_[NUM_MB_SEGMENTS]; // probabilities - VP8Proba proba_, proba_saved_; - int update_proba_; + VP8Proba proba_; int use_skip_proba_; - uint8_t skip_p_, intra_p_, last_p_, golden_p_; + uint8_t skip_p_; +#ifndef ONLY_KEYFRAME_CODE + uint8_t intra_p_, last_p_, golden_p_; + VP8Proba proba_saved_; + int update_proba_; +#endif // Boundary data cache and persistent buffers. uint8_t* intra_t_; // top intra modes values: 4 * mb_w_