|
|
|
@ -36,7 +36,6 @@ typedef struct YopDecContext { |
|
|
|
|
int num_pal_colors; |
|
|
|
|
int first_color[2]; |
|
|
|
|
int frame_data_length; |
|
|
|
|
int row_pos; |
|
|
|
|
|
|
|
|
|
uint8_t *low_nibble; |
|
|
|
|
uint8_t *srcptr; |
|
|
|
@ -177,27 +176,12 @@ static uint8_t yop_get_next_nibble(YopDecContext *s) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Take s->dstptr to the next macroblock in sequence. |
|
|
|
|
*/ |
|
|
|
|
static void yop_next_macroblock(YopDecContext *s) |
|
|
|
|
{ |
|
|
|
|
// If we are advancing to the next row of macroblocks
|
|
|
|
|
if (s->row_pos == s->frame.linesize[0] - 2) { |
|
|
|
|
s->dstptr += s->frame.linesize[0]; |
|
|
|
|
s->row_pos = 0; |
|
|
|
|
}else { |
|
|
|
|
s->row_pos += 2; |
|
|
|
|
} |
|
|
|
|
s->dstptr += 2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int yop_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
AVPacket *avpkt) |
|
|
|
|
{ |
|
|
|
|
YopDecContext *s = avctx->priv_data; |
|
|
|
|
int tag, firstcolor, is_odd_frame; |
|
|
|
|
int ret, i; |
|
|
|
|
int ret, i, x, y; |
|
|
|
|
uint32_t *palette; |
|
|
|
|
|
|
|
|
|
if (s->frame.data[0]) |
|
|
|
@ -214,12 +198,9 @@ static int yop_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
s->frame.linesize[0] = avctx->width; |
|
|
|
|
|
|
|
|
|
s->dstbuf = s->frame.data[0]; |
|
|
|
|
s->dstptr = s->frame.data[0]; |
|
|
|
|
s->srcptr = avpkt->data + 4; |
|
|
|
|
s->row_pos = 0; |
|
|
|
|
s->low_nibble = NULL; |
|
|
|
|
|
|
|
|
|
is_odd_frame = avpkt->data[0]; |
|
|
|
@ -240,9 +221,12 @@ static int yop_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
|
|
|
|
|
s->frame.palette_has_changed = 1; |
|
|
|
|
|
|
|
|
|
while (s->dstptr - s->dstbuf < |
|
|
|
|
avctx->width * avctx->height && |
|
|
|
|
s->srcptr - avpkt->data < avpkt->size) { |
|
|
|
|
for (y = 0; y < avctx->height; y += 2) { |
|
|
|
|
for (x = 0; x < avctx->width; x += 2) { |
|
|
|
|
if (s->srcptr - avpkt->data >= avpkt->size) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Packet too small.\n"); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
tag = yop_get_next_nibble(s); |
|
|
|
|
|
|
|
|
@ -256,7 +240,9 @@ static int yop_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
yop_next_macroblock(s); |
|
|
|
|
s->dstptr += 2; |
|
|
|
|
} |
|
|
|
|
s->dstptr += 2*s->frame.linesize[0] - x; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*got_frame = 1; |
|
|
|
|