*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
codebook[i].u = 128 + *data++;
codebook[i].v = 128 + *data++;
} else {
- /* this codebook type indicates either greyscale or
+ /* this codebook type indicates either greyscale or
* palettized video; if palettized, U & V components will
* not be used so it is safe to set them to 128 for the
* benefit of greyscale rendering in YUV420P */
while ((data + 4) <= eod) {
chunk_id = BE_16 (&data[0]);
chunk_size = BE_16 (&data[2]) - 4;
+ if(chunk_size < 0)
+ return -1;
+
data += 4;
chunk_size = ((data + chunk_size) > eod) ? (eod - data) : chunk_size;
case 0x2100:
case 0x2400:
case 0x2500:
- cinepak_decode_codebook (strip->v4_codebook, chunk_id,
+ cinepak_decode_codebook (strip->v4_codebook, chunk_id,
chunk_size, data);
break;
case 0x2300:
case 0x2600:
case 0x2700:
- cinepak_decode_codebook (strip->v1_codebook, chunk_id,
+ cinepak_decode_codebook (strip->v1_codebook, chunk_id,
chunk_size, data);
break;
case 0x3000:
case 0x3100:
case 0x3200:
- return cinepak_decode_vectors (s, strip, chunk_id,
+ return cinepak_decode_vectors (s, strip, chunk_id,
chunk_size, data);
}
uint8_t *eod = (s->data + s->size);
int i, result, strip_size, frame_flags, num_strips;
int y0 = 0;
+ int encoded_buf_size;
+ /* if true, Cinepak data is from a Sega FILM/CPK file */
+ int sega_film_data = 0;
if (s->size < 10)
return -1;
frame_flags = s->data[0];
num_strips = BE_16 (&s->data[8]);
- s->data += 10;
+ encoded_buf_size = ((s->data[1] << 16) | BE_16 (&s->data[2]));
+ if (encoded_buf_size != s->size)
+ sega_film_data = 1;
+ if (sega_film_data)
+ s->data += 12;
+ else
+ s->data += 10;
if (num_strips > MAX_STRIPS)
num_strips = MAX_STRIPS;
s->height = (avctx->height + 3) & ~3;
// check for paletted data
- if (avctx->palctrl == NULL) {
+ if ((avctx->palctrl == NULL) || (avctx->bits_per_sample == 40)) {
s->palette_video = 0;
avctx->pix_fmt = PIX_FMT_YUV420P;
} else {