You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
One non functional AVPalette chunk less, one heap overflow less.
Fixes playback of CIMOVI01.avi. Originally committed as revision 12517 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@@ -43,6 +43,8 @@ typedef struct AVIStream {
|
|||||||
|
|
||||||
int prefix; ///< normally 'd'<<8 + 'c' or 'w'<<8 + 'b'
|
int prefix; ///< normally 'd'<<8 + 'c' or 'w'<<8 + 'b'
|
||||||
int prefix_count;
|
int prefix_count;
|
||||||
|
uint32_t pal[256];
|
||||||
|
int has_pal;
|
||||||
} AVIStream;
|
} AVIStream;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -684,6 +686,14 @@ resync:
|
|||||||
size= ast->remaining;
|
size= ast->remaining;
|
||||||
av_get_packet(pb, pkt, size);
|
av_get_packet(pb, pkt, size);
|
||||||
|
|
||||||
|
if(ast->has_pal && pkt->data && pkt->size<(unsigned)INT_MAX/2){
|
||||||
|
ast->has_pal=0;
|
||||||
|
pkt->size += 4*256;
|
||||||
|
pkt->data = av_realloc(pkt->data, pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||||
|
if(pkt->data)
|
||||||
|
memcpy(pkt->data + pkt->size - 4*256, ast->pal, 4*256);
|
||||||
|
}
|
||||||
|
|
||||||
if (ENABLE_DV_DEMUXER && avi->dv_demux) {
|
if (ENABLE_DV_DEMUXER && avi->dv_demux) {
|
||||||
dstr = pkt->destruct;
|
dstr = pkt->destruct;
|
||||||
size = dv_produce_packet(avi->dv_demux, pkt,
|
size = dv_produce_packet(avi->dv_demux, pkt,
|
||||||
@@ -781,6 +791,17 @@ resync:
|
|||||||
goto resync;
|
goto resync;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (d[2] == 'p' && d[3] == 'c' && size<=4*256+4) {
|
||||||
|
int k = get_byte(pb);
|
||||||
|
int last = (k + get_byte(pb) - 1) & 0xFF;
|
||||||
|
|
||||||
|
get_le16(pb); //flags
|
||||||
|
|
||||||
|
for (; k <= last; k++)
|
||||||
|
ast->pal[k] = get_be32(pb)>>8;// b + (g << 8) + (r << 16);
|
||||||
|
ast->has_pal= 1;
|
||||||
|
goto resync;
|
||||||
|
} else
|
||||||
if( ((ast->prefix_count<5 || sync+9 > i) && d[2]<128 && d[3]<128) ||
|
if( ((ast->prefix_count<5 || sync+9 > i) && d[2]<128 && d[3]<128) ||
|
||||||
d[2]*256+d[3] == ast->prefix /*||
|
d[2]*256+d[3] == ast->prefix /*||
|
||||||
(d[2] == 'd' && d[3] == 'c') ||
|
(d[2] == 'd' && d[3] == 'c') ||
|
||||||
@@ -807,35 +828,6 @@ resync:
|
|||||||
goto resync;
|
goto resync;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* palette changed chunk */
|
|
||||||
if ( d[0] >= '0' && d[0] <= '9'
|
|
||||||
&& d[1] >= '0' && d[1] <= '9'
|
|
||||||
&& ((d[2] == 'p' && d[3] == 'c'))
|
|
||||||
&& n < s->nb_streams && i + size <= avi->fsize) {
|
|
||||||
|
|
||||||
AVStream *st;
|
|
||||||
int first, clr, flags, k, p;
|
|
||||||
|
|
||||||
st = s->streams[n];
|
|
||||||
|
|
||||||
first = get_byte(pb);
|
|
||||||
clr = get_byte(pb);
|
|
||||||
if(!clr) /* all 256 colors used */
|
|
||||||
clr = 256;
|
|
||||||
flags = get_le16(pb);
|
|
||||||
p = 4;
|
|
||||||
for (k = first; k < clr + first; k++) {
|
|
||||||
int r, g, b;
|
|
||||||
r = get_byte(pb);
|
|
||||||
g = get_byte(pb);
|
|
||||||
b = get_byte(pb);
|
|
||||||
get_byte(pb);
|
|
||||||
st->codec->palctrl->palette[k] = b + (g << 8) + (r << 16);
|
|
||||||
}
|
|
||||||
st->codec->palctrl->palette_changed = 1;
|
|
||||||
goto resync;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
Reference in New Issue
Block a user