unsigned char len;
int ofs;
- int frame_x, frame_y;
+ int frame_x, frame_y, prev_linesize;
int frame_width, frame_height;
frame_x = AV_RL16(&s->buf[6]);
frame_y + frame_height > s->avctx->height) {
av_log(s->avctx, AV_LOG_ERROR,
"Invalid vertical range %d-%d\n",
- frame_x, frame_width);
+ frame_y, frame_height);
return AVERROR_INVALIDDATA;
}
}
dp = &frame->data[0][frame_y * frame->linesize[0] + frame_x];
- pp = &s->prev_frame->data[0][frame_y * s->prev_frame->linesize[0] + frame_x];
+ if (s->prev_frame->data[0]) {
+ prev_linesize = s->prev_frame->linesize[0];
+ pp = s->prev_frame->data[0] + frame_y * prev_linesize + frame_x;
+ } else {
+ pp = NULL;
+ prev_linesize = 0;
+ }
switch (meth) {
case 1:
for (i = 0; i < frame_height; i++) {
ofs += len;
} else {
/* interframe pixel copy */
- if (ofs + len + 1 > frame_width || !s->prev_frame->data[0])
+ if (ofs + len + 1 > frame_width || !pp)
return AVERROR_INVALIDDATA;
memcpy(&dp[ofs], &pp[ofs], len + 1);
ofs += len + 1;
return AVERROR_INVALIDDATA;
}
dp += frame->linesize[0];
- pp += s->prev_frame->linesize[0];
+ pp = FF_PTR_ADD(pp, prev_linesize);
}
break;
for (i = 0; i < frame_height; i++) {
bytestream2_get_buffer(&gb, dp, frame_width);
dp += frame->linesize[0];
- pp += s->prev_frame->linesize[0];
}
break;
}
} else {
/* interframe pixel copy */
- if (ofs + len + 1 > frame_width || !s->prev_frame->data[0])
+ if (ofs + len + 1 > frame_width || !pp)
return AVERROR_INVALIDDATA;
memcpy(&dp[ofs], &pp[ofs], len + 1);
ofs += len + 1;
return AVERROR_INVALIDDATA;
}
dp += frame->linesize[0];
- pp += s->prev_frame->linesize[0];
+ pp = FF_PTR_ADD(pp, prev_linesize);
}
break;
}
return buf_size;
}
-AVCodec ff_vmdvideo_decoder = {
+const AVCodec ff_vmdvideo_decoder = {
.name = "vmdvideo",
.long_name = NULL_IF_CONFIG_SMALL("Sierra VMD video"),
.type = AVMEDIA_TYPE_VIDEO,