const uint8_t *src = avpkt->data;
const uint8_t *srca;
uint8_t *y, *u, *v, *a;
- int transparent, interlaced = 1, skip[2], i, j, k;
+ int transparent, interlaced = 1, skip, opaque_length, i, j, k;
if (pic->data[0])
avctx->release_buffer(avctx, pic);
- if (!memcmp(&avctx->extradata[4], "APRGAPRG0001", 12) &&
- avctx->extradata_size >= 24)
+ if (avctx->extradata_size >= 24 &&
+ !memcmp(&avctx->extradata[4], "APRGAPRG0001", 12))
interlaced = avctx->extradata[19] != 1;
- skip[0] = skip[1] = 16;
if (avctx->height == 486) {
- skip[0] = 8;
- skip[1] = 12;
+ skip = 10;
+ } else {
+ skip = 16;
}
- if (avpkt->size < avctx->width * (2 * avctx->height + skip[0] + skip[1])
- + 4 * interlaced) {
+ opaque_length = 2 * avctx->width * (avctx->height + skip) + 4 * interlaced;
+ if (avpkt->size < opaque_length) {
av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n");
return AVERROR(EINVAL);
}
transparent = avctx->bits_per_coded_sample == 32 &&
- avpkt->size >= (2 * avctx->height + skip[0] + skip[1]) *
- 2 * avctx->width + 4 + 8 * interlaced;
- srca = src + (2 * avctx->height + skip[0] + skip[1]) * avctx->width
- + 5 + interlaced * 4;
+ avpkt->size >= opaque_length * 2 + 4;
+ srca = src + opaque_length + 5;
pic->reference = 0;
pic->pict_type = AV_PICTURE_TYPE_I;
if (!interlaced) {
- src += avctx->width * skip[1];
- srca += avctx->width * skip[1];
+ src += avctx->width * skip;
+ srca += avctx->width * skip;
}
for (i = 0; i < interlaced + 1; i++) {
- src += avctx->width * skip[i];
- srca += avctx->width * skip[i];
- y = pic->data[0] + i * pic->linesize[0];
- u = pic->data[1] + i * pic->linesize[1];
- v = pic->data[2] + i * pic->linesize[2];
- a = pic->data[3] + i * pic->linesize[3];
+ src += avctx->width * skip;
+ srca += avctx->width * skip;
+ if (interlaced && avctx->height == 486) {
+ y = pic->data[0] + (1 - i) * pic->linesize[0];
+ u = pic->data[1] + (1 - i) * pic->linesize[1];
+ v = pic->data[2] + (1 - i) * pic->linesize[2];
+ a = pic->data[3] + (1 - i) * pic->linesize[3];
+ } else {
+ y = pic->data[0] + i * pic->linesize[0];
+ u = pic->data[1] + i * pic->linesize[1];
+ v = pic->data[2] + i * pic->linesize[2];
+ a = pic->data[3] + i * pic->linesize[3];
+ }
for (j = 0; j < avctx->height >> interlaced; j++) {
for (k = 0; k < avctx->width >> 1; k++) {