|
|
|
@ -31,6 +31,7 @@ |
|
|
|
|
|
|
|
|
|
typedef struct SheerVideoContext { |
|
|
|
|
unsigned format; |
|
|
|
|
int alt; |
|
|
|
|
VLC vlc[2]; |
|
|
|
|
void (*decode_frame)(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb); |
|
|
|
|
} SheerVideoContext; |
|
|
|
@ -2038,7 +2039,7 @@ static void decode_ybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) |
|
|
|
|
dst_v[x] = get_bits(gb, 8); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
int pred[4] = { 125, -128, -128, -128 }; |
|
|
|
|
int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 }; |
|
|
|
|
|
|
|
|
|
for (x = 0; x < avctx->width; x++) { |
|
|
|
|
int y, u, v; |
|
|
|
@ -2106,7 +2107,7 @@ static void decode_ybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb) |
|
|
|
|
dst_v[x] = get_bits(gb, 8); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
int pred[4] = { 125, -128, -128, -128 }; |
|
|
|
|
int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 }; |
|
|
|
|
|
|
|
|
|
for (x = 0; x < avctx->width; x++) { |
|
|
|
|
int y, u, v; |
|
|
|
@ -2887,6 +2888,7 @@ static int decode_frame(AVCodecContext *avctx, |
|
|
|
|
AV_RL32(avpkt->data) != MKTAG('Z','w','a','k')) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
|
|
s->alt = 0; |
|
|
|
|
format = AV_RL32(avpkt->data + 16); |
|
|
|
|
switch (format) { |
|
|
|
|
case MKTAG(' ', 'R', 'G', 'B'): |
|
|
|
@ -2972,6 +2974,7 @@ static int decode_frame(AVCodecContext *avctx, |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case MKTAG(' ', 'Y', 'B', 'R'): |
|
|
|
|
s->alt = 1; |
|
|
|
|
case MKTAG(' ', 'Y', 'b', 'R'): |
|
|
|
|
avctx->pix_fmt = AV_PIX_FMT_YUV444P; |
|
|
|
|
s->decode_frame = decode_ybr; |
|
|
|
@ -2981,6 +2984,7 @@ static int decode_frame(AVCodecContext *avctx, |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case MKTAG(' ', 'y', 'B', 'R'): |
|
|
|
|
s->alt = 1; |
|
|
|
|
case MKTAG(' ', 'y', 'b', 'R'): |
|
|
|
|
avctx->pix_fmt = AV_PIX_FMT_YUV444P; |
|
|
|
|
s->decode_frame = decode_ybri; |
|
|
|
|