diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c index c7a04c0520..e84a63bc30 100644 --- a/libavcodec/qtrle.c +++ b/libavcodec/qtrle.c @@ -72,6 +72,15 @@ static void qtrle_decode_1bpp(QtrleContext *s, int stream_ptr, int row_ptr, int unsigned char *rgb = s->frame.data[0]; int pixel_limit = s->frame.linesize[0] * s->avctx->height; int skip; + /* skip & 0x80 appears to mean 'start a new line', which can be interpreted + * as 'go to next line' during the decoding of a frame but is 'go to first + * line' at the beginning. Since we always interpret it as 'go to next line' + * in the decoding loop (which makes code simpler/faster), the first line + * would not be counted, so we count one more. + * See: https://ffmpeg.org/trac/ffmpeg/ticket/226 + * In the following decoding loop, row_ptr will be the position of the + * _next_ row. */ + lines_to_change++; while (lines_to_change) { CHECK_STREAM_PTR(2); @@ -81,8 +90,8 @@ static void qtrle_decode_1bpp(QtrleContext *s, int stream_ptr, int row_ptr, int break; if(skip & 0x80) { lines_to_change--; - row_ptr += row_inc; pixel_ptr = row_ptr + 2 * (skip & 0x7f); + row_ptr += row_inc; } else pixel_ptr += 2 * skip; CHECK_PIXEL_PTR(0); /* make sure pixel_ptr is positive */ diff --git a/tests/ref/fate/qtrle-1bit b/tests/ref/fate/qtrle-1bit index 040c9bfe72..0480ab8576 100644 --- a/tests/ref/fate/qtrle-1bit +++ b/tests/ref/fate/qtrle-1bit @@ -1,107 +1,107 @@ -0, 0, 9600, 0xc1632102 +0, 0, 9600, 0xc5921aa2 1, 0, 2040, 0x0a157db4 1, 4163, 2040, 0x00c63e08 -0, 7500, 9600, 0x0f6c0521 +0, 7500, 9600, 0x9032fc52 1, 8327, 2040, 0xacf2a25b 1, 12490, 2040, 0xd6189e85 -0, 15000, 9600, 0x04b90b5a +0, 15000, 9600, 0x7db0038e 1, 16653, 2040, 0x8276f843 1, 20816, 2040, 0xadebae73 -0, 22500, 9600, 0x2ebd4500 +0, 22500, 9600, 0x95b73c41 1, 24980, 2040, 0x5da76697 1, 29143, 2040, 0x469d0ea7 -0, 30000, 9600, 0x726f46f4 +0, 30000, 9600, 0x531e4189 1, 33306, 2040, 0x0d7412e1 1, 37469, 2040, 0x2f2cc63f -0, 37500, 9600, 0x37f6968e +0, 37500, 9600, 0xb73390ec 1, 41633, 2040, 0x10106eb7 -0, 45000, 9600, 0x7305872e +0, 45000, 9600, 0x958e8221 1, 45796, 2040, 0x300124c7 1, 49959, 2040, 0xa329f8e8 -0, 52500, 9600, 0x222eff5e +0, 52500, 9600, 0xd393f8a6 1, 54122, 2040, 0xcea35ca5 1, 58286, 2040, 0x55105aef -0, 60000, 9600, 0x9317e227 +0, 60000, 9600, 0xa085da1c 1, 62449, 2040, 0x08980ce1 1, 66612, 2040, 0x367faf24 -0, 67500, 9600, 0x421eee9d +0, 67500, 9600, 0x57ace74f 1, 70776, 2040, 0x75bfef06 1, 74939, 2040, 0x34f1daf4 -0, 75000, 9600, 0xcbcfaaff +0, 75000, 9600, 0x5d11a308 1, 79102, 2040, 0x97050317 -0, 82500, 9600, 0xe7d43be2 +0, 82500, 9600, 0x13e133b7 1, 83265, 2040, 0xd297c536 1, 87429, 2040, 0xa8abad5a -0, 90000, 9600, 0x0b71e28c +0, 90000, 9600, 0x494edb86 1, 91592, 2040, 0x445ce8e0 1, 95755, 2040, 0xa3f4d940 -0, 97500, 9600, 0xd6a050ca +0, 97500, 9600, 0x43a448ea 1, 99918, 2040, 0x0ebb7b26 1, 104082, 2040, 0x4372f6f6 -0, 105000, 9600, 0x0ac6dbf5 +0, 105000, 9600, 0x3562d35b 1, 108245, 2040, 0xd4365079 1, 112408, 2040, 0x56f902f7 -0, 112500, 9600, 0x5c036038 +0, 112500, 9600, 0x0bc655d2 1, 116571, 2040, 0x4153938a -0, 120000, 9600, 0x6e417ed6 +0, 120000, 9600, 0xbece73a1 1, 120735, 2040, 0x14996d86 1, 124898, 2040, 0x3f99c318 -0, 127500, 9600, 0x8bd0dc22 +0, 127500, 9600, 0x82e7cfa1 1, 129061, 2040, 0x939978a5 1, 133224, 2040, 0x7086bd44 -0, 135000, 9600, 0xdf3b0877 +0, 135000, 9600, 0xda29fd8f 1, 137388, 276, 0x25b89d22 1, 137951, 2040, 0xf3edb106 1, 142114, 2040, 0x0ca61430 -0, 142500, 9600, 0xae6e7823 +0, 142500, 9600, 0x70fb700b 1, 146278, 2040, 0x7229c458 -0, 150000, 9600, 0x8ff0ac32 +0, 150000, 9600, 0xaf57a6b0 1, 150441, 2040, 0xc37edd31 1, 154604, 2040, 0xa3da98b4 -0, 157500, 9600, 0xa2d9e2ce +0, 157500, 9600, 0x0a5ed9b9 1, 158767, 2040, 0x69704803 1, 162931, 2040, 0xa79bf334 -0, 165000, 9600, 0x5fd92b65 +0, 165000, 9600, 0xf7c62c38 1, 167094, 2040, 0x59d8d4c4 1, 171257, 2040, 0xf9ff0271 -0, 172500, 9600, 0x81c1c824 +0, 172500, 9600, 0x0aa2ccfd 1, 175420, 2040, 0xc4ced9d6 1, 179584, 2040, 0x859f1912 -0, 180000, 9600, 0xb8a2ace4 +0, 180000, 9600, 0xc9adabae 1, 183747, 2040, 0xe7955aa6 -0, 187500, 9600, 0x65b70404 +0, 187500, 9600, 0x67ff0aba 1, 187910, 2040, 0x374624fd 1, 192073, 2040, 0x52121097 -0, 195000, 9600, 0xc5349eb2 +0, 195000, 9600, 0xea79a465 1, 196237, 2040, 0x660fe645 1, 200400, 2040, 0xf624176a -0, 202500, 9600, 0xf60cc2b8 +0, 202500, 9600, 0x8928c626 1, 204563, 2040, 0x1f2246dd 1, 208727, 2040, 0x940e0a32 -0, 210000, 9600, 0x31474595 +0, 210000, 9600, 0x8dab4111 1, 212890, 2040, 0x9c6d338c 1, 217053, 2040, 0xfce0d30a -0, 217500, 9600, 0xf602635b +0, 217500, 9600, 0x81ef63f9 1, 221216, 2040, 0xd0ec9aa5 -0, 225000, 9600, 0x873cbd87 +0, 225000, 9600, 0xf977bc5e 1, 225380, 2040, 0x58012141 1, 229543, 2040, 0xde67fc43 -0, 232500, 9600, 0xb9793ffe +0, 232500, 9600, 0x9e6a3f4a 1, 233706, 2040, 0x6baa0450 1, 237869, 2040, 0xf4f80252 -0, 240000, 9600, 0x42eb2831 +0, 240000, 9600, 0x77c92865 1, 242033, 2040, 0x0cd47ee3 1, 246196, 2040, 0x129cbaa7 -0, 247500, 9600, 0x44cc1dab +0, 247500, 9600, 0x3915170d 1, 250359, 2040, 0x5ef5c0a1 1, 254522, 2040, 0xf660baa7 -0, 255000, 9600, 0xbdcbbb87 +0, 255000, 9600, 0xbe19b995 1, 258686, 2040, 0xe48bc0a1 -0, 262500, 9600, 0x29c22df7 +0, 262500, 9600, 0x3e8a3077 1, 262849, 2040, 0xdfeabaa7 1, 267012, 2040, 0xed04c0a1 -0, 270000, 9600, 0xde502ef5 +0, 270000, 9600, 0x1331342e 1, 271176, 2040, 0xd771baa7 1, 275339, 300, 0x521f24e9 1, 275951, 1476, 0x9b9394b1 -0, 277500, 9600, 0xaf311aeb +0, 277500, 9600, 0x4d692175