* huffyuv decoder
*/
+#define UNCHECKED_BITSTREAM_READER 1
+
#include "avcodec.h"
#include "get_bits.h"
#include "huffyuv.h"
len[i] = len0 + len1;
bits[i] = (s->bits[p0][y] << len1) + s->bits[p][u];
symbols[i] = (y << 8) + (u & 0xFF);
- if(symbols[i] != 0xffff) // reserved to mean "invalid"
i++;
}
}
unsigned int index = SHOW_UBITS(name, gb, bits); \
int code, n = dtable[index][1]; \
\
- if (n>0) { \
- code = dtable[index][0]; \
- OP(dst0, dst1, code); \
- LAST_SKIP_BITS(name, gb, n); \
- } else { \
+ if (n<=0) { \
int nb_bits; \
VLC_INTERN(dst0, table1, gb, name, bits, max_depth); \
\
UPDATE_CACHE(re, gb); \
index = SHOW_UBITS(name, gb, bits); \
VLC_INTERN(dst1, table2, gb, name, bits, max_depth); \
+ } else { \
+ code = dtable[index][0]; \
+ OP(dst0, dst1, code); \
+ LAST_SKIP_BITS(name, gb, n); \
} \
} while (0)
static void decode_422_bitstream(HYuvContext *s, int count)
{
- int i;
+ int i, icount;
OPEN_READER(re, &s->gb);
count /= 2;
- if (count >= (get_bits_left(&s->gb)) / (31 * 4)) {
- for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
+ icount = get_bits_left(&s->gb) / (32 * 4);
+ if (count >= icount) {
+ for (i = 0; i < icount; i++) {
+ READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1);
+ READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
+ }
+ for (; i < count && get_bits_left(&s->gb) > 0; i++) {
READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1);
+ if (get_bits_left(&s->gb) <= 0) break;
READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
}
for (; i < count; i++)
s->temp[0][2 * i ] = s->temp[1][i] =
- s->temp[0][2 * i + 1] = s->temp[2][i] = 128;
+ s->temp[0][2 * i + 1] = s->temp[2][i] = 0;
} else {
for (i = 0; i < count; i++) {
READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1);
if (s->bps <= 8) {
OPEN_READER(re, &s->gb);
- if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
+ if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
}
CLOSE_READER(re, &s->gb);
} else if (s->bps <= 14) {
OPEN_READER(re, &s->gb);
- if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
+ if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
}
}
CLOSE_READER(re, &s->gb);
} else {
- if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
+ if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
}
OPEN_READER(re, &s->gb);
count/=2;
- if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
+ if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
}
int i;
OPEN_READER(re, &s->gb);
- for (i = 0; i < count; i++) {
+ for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
unsigned int index;
int code, n;
index = SHOW_UBITS(re, &s->gb, VLC_BITS);
VLC_INTERN(s->temp[0][4 * i + A], s->vlc[2].table,
&s->gb, re, VLC_BITS, 3);
- }
+ } else
+ s->temp[0][4 * i + A] = 0;
}
}
CLOSE_READER(re, &s->gb);
if (!s->bitstream_buffer)
return AVERROR(ENOMEM);
- s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer,
- (const uint32_t*)buf, buf_size / 4);
+ s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
+ (const uint32_t *) buf, buf_size / 4);
if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
return ret;