mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
lavc/sunrastenc: consider cases with linesize < 0
Make sunrast_image_write_image() deal with cases when linesize is < 0. Fix trac ticket #1077.
This commit is contained in:
parent
f645132061
commit
11642cd16f
@ -56,7 +56,7 @@ static void sunrast_image_write_image(AVCodecContext *avctx,
|
||||
{
|
||||
SUNRASTContext *s = avctx->priv_data;
|
||||
const uint8_t *ptr;
|
||||
int len, alen, x;
|
||||
int len, alen, x, y;
|
||||
|
||||
if (s->maplength) { // palettized
|
||||
PutByteContext pb_r, pb_g;
|
||||
@ -83,30 +83,30 @@ static void sunrast_image_write_image(AVCodecContext *avctx,
|
||||
if (s->type == RT_BYTE_ENCODED) {
|
||||
uint8_t value, value2;
|
||||
int run;
|
||||
const uint8_t *end = pixels + avctx->height * linesize;
|
||||
|
||||
y = 0;
|
||||
ptr = pixels;
|
||||
|
||||
#define GET_VALUE ptr >= end ? 0 : x >= len ? ptr[len-1] : ptr[x]
|
||||
#define GET_VALUE y >= avctx->height ? 0 : x >= len ? ptr[len-1] : ptr[x]
|
||||
|
||||
x = 0;
|
||||
x = 0, y = 0;
|
||||
value2 = GET_VALUE;
|
||||
while (ptr < end) {
|
||||
while (y < avctx->height) {
|
||||
run = 1;
|
||||
value = value2;
|
||||
x++;
|
||||
if (x >= alen) {
|
||||
x = 0;
|
||||
ptr += linesize;
|
||||
ptr += linesize, y++;
|
||||
}
|
||||
|
||||
value2 = GET_VALUE;
|
||||
while (value2 == value && run < 256 && ptr < end) {
|
||||
while (value2 == value && run < 256 && y < avctx->height) {
|
||||
x++;
|
||||
run++;
|
||||
if (x >= alen) {
|
||||
x = 0;
|
||||
ptr += linesize;
|
||||
ptr += linesize, y++;
|
||||
}
|
||||
value2 = GET_VALUE;
|
||||
}
|
||||
@ -125,7 +125,6 @@ static void sunrast_image_write_image(AVCodecContext *avctx,
|
||||
// update data length for header
|
||||
s->length = bytestream2_tell_p(&s->p) - 32 - s->maplength;
|
||||
} else {
|
||||
int y;
|
||||
for (y = 0; y < avctx->height; y++) {
|
||||
bytestream2_put_buffer(&s->p, ptr, len);
|
||||
if (len < alen)
|
||||
|
Loading…
Reference in New Issue
Block a user