@@ -14,8 +14,8 @@ struct BitStream { // most significant 16 bits
1414 : _src(src), _bits(0 ), _len(0 ), _end(src + size) {
1515 }
1616
17- bool endOfStream () const {
18- return _src >= _end && _len == 0 ;
17+ int bitsAvailable () const {
18+ return (_end - _src) * 8 + _len ;
1919 }
2020
2121 int getBits (int count) { // 6 to 16 bits
@@ -32,7 +32,7 @@ struct BitStream { // most significant 16 bits
3232 }
3333 int getSignedBits (int len) {
3434 const int shift = 32 - len;
35- int32_t value = getBits (len);
35+ const int32_t value = getBits (len);
3636 return (value << shift) >> shift;
3737 }
3838 bool getBit () {
@@ -54,7 +54,7 @@ static int readDC(BitStream *bs, int version) {
5454static void readAC (BitStream *bs, int *coefficients) {
5555 int count = 0 ;
5656 int node = 0 ;
57- while (! bs->endOfStream () ) {
57+ while (bs->bitsAvailable () > 0 ) {
5858 const uint16_t value = _acHuffTree[node].value ;
5959 switch (value) {
6060 case kAcHuff_EscapeCode : {
@@ -176,14 +176,14 @@ static void decodeBlock(BitStream *bs, int x8, int y8, uint8_t *dst, int dstPitc
176176 }
177177}
178178
179- int decodeMDEC (const uint8_t *src, int len, const uint8_t *mborder, int w, int h, MdecOutput *out) {
179+ int decodeMDEC (const uint8_t *src, int len, const uint8_t *mborder, int mblen, int w, int h, MdecOutput *out) {
180180 BitStream bs (src, len);
181181 bs.getBits (16 );
182182 const uint16_t vlc = bs.getBits (16 );
183183 assert (vlc == 0x3800 );
184184 const uint16_t qscale = bs.getBits (16 );
185185 const uint16_t version = bs.getBits (16 );
186- // fprintf(stdout, "mdec qscale %d version %d\n", qscale, version);
186+ // fprintf(stdout, "mdec qscale %d version %d w %d h %d \n", qscale, version, w, h );
187187 assert (version == 2 );
188188
189189 const int blockW = (w + 15 ) / 16 ;
@@ -196,24 +196,29 @@ int decodeMDEC(const uint8_t *src, int len, const uint8_t *mborder, int w, int h
196196 const int crPitch = out->planes [kOutputPlaneCr ].pitch ;
197197 uint8_t *crPtr = out->planes [kOutputPlaneCr ].ptr + out->y / 2 * crPitch + out->x / 2 ;
198198
199+ int z = 0 ;
199200 for (int x = 0 ; x < blockW; ++x) {
200201 for (int y = 0 ; y < blockH; ++y) {
201- if (mborder ) {
202- const uint8_t xy = * mborder++ ;
202+ if (z < mblen ) {
203+ const uint8_t xy = mborder[z] ;
203204 if ((xy & 15 ) != x || (xy >> 4 ) != y) {
204205 continue ;
205206 }
207+ ++z;
206208 }
207209 decodeBlock (&bs, x, y, crPtr, crPitch, qscale, version);
208210 decodeBlock (&bs, x, y, cbPtr, cbPitch, qscale, version);
209211 decodeBlock (&bs, 2 * x, 2 * y, yPtr, yPitch, qscale, version);
210212 decodeBlock (&bs, 2 * x + 1 , 2 * y, yPtr, yPitch, qscale, version);
211213 decodeBlock (&bs, 2 * x, 2 * y + 1 , yPtr, yPitch, qscale, version);
212214 decodeBlock (&bs, 2 * x + 1 , 2 * y + 1 , yPtr, yPitch, qscale, version);
215+ if (mborder && z == mblen) {
216+ goto end;
217+ }
213218 }
214219 }
215-
216- if (!mborder) {
220+ end:
221+ if (!mborder && bs. bitsAvailable () >= 11 ) {
217222 const int eof = bs.getBits (11 );
218223 assert (eof == 0x3FE ); // v2 frame
219224 }
0 commit comments