@ -42,9 +42,11 @@
# define ID_PBM MKTAG('P','B','M',' ')
# define ID_ILBM MKTAG('I','L','B','M')
# define ID_BMHD MKTAG('B','M','H','D')
# define ID_DGBL MKTAG('D','G','B','L')
# define ID_CAMG MKTAG('C','A','M','G')
# define ID_CMAP MKTAG('C','M','A','P')
# define ID_ACBM MKTAG('A','C','B','M')
# define ID_DEEP MKTAG('D','E','E','P')
# define ID_FORM MKTAG('F','O','R','M')
# define ID_ANNO MKTAG('A','N','N','O')
@ -57,7 +59,9 @@
# define ID_TEXT MKTAG('T','E','X','T')
# define ID_ABIT MKTAG('A','B','I','T')
# define ID_BODY MKTAG('B','O','D','Y')
# define ID_DBOD MKTAG('D','B','O','D')
# define ID_ANNO MKTAG('A','N','N','O')
# define ID_DPEL MKTAG('D','P','E','L')
# define LEFT 2
# define RIGHT 4
@ -121,11 +125,14 @@ static int iff_probe(AVProbeData *p)
const uint8_t * d = p - > buf ;
if ( AV_RL32 ( d ) = = ID_FORM & &
( AV_RL32 ( d + 8 ) = = ID_8SVX | | AV_RL32 ( d + 8 ) = = ID_PBM | | AV_RL32 ( d + 8 ) = = ID_IL BM | | AV_RL32 ( d + 8 ) = = ID_AC BM ) )
( AV_RL32 ( d + 8 ) = = ID_8SVX | | AV_RL32 ( d + 8 ) = = ID_PBM | | AV_RL32 ( d + 8 ) = = ID_AC BM | | AV_RL32 ( d + 8 ) = = ID_DEEP | | AV_RL32 ( d + 8 ) = = ID_IL BM ) )
return AVPROBE_SCORE_MAX ;
return 0 ;
}
static const uint8_t deep_rgb24 [ ] = { 0 , 0 , 0 , 3 , 0 , 1 , 0 , 8 , 0 , 2 , 0 , 8 , 0 , 3 , 0 , 8 } ;
static const uint8_t deep_rgba [ ] = { 0 , 0 , 0 , 4 , 0 , 1 , 0 , 8 , 0 , 2 , 0 , 8 , 0 , 3 , 0 , 8 } ;
static int iff_read_header ( AVFormatContext * s )
{
IffDemuxContext * iff = s - > priv_data ;
@ -136,6 +143,8 @@ static int iff_read_header(AVFormatContext *s)
uint32_t screenmode = 0 ;
unsigned transparency = 0 ;
unsigned masking = 0 ; // no mask
uint8_t fmt [ 16 ] ;
int fmt_size ;
st = avformat_new_stream ( s , NULL ) ;
if ( ! st )
@ -170,6 +179,7 @@ static int iff_read_header(AVFormatContext *s)
case ID_ABIT :
case ID_BODY :
case ID_DBOD :
iff - > body_pos = avio_tell ( pb ) ;
iff - > body_size = data_size ;
break ;
@ -218,6 +228,38 @@ static int iff_read_header(AVFormatContext *s)
}
break ;
case ID_DPEL :
if ( data_size < 4 | | ( data_size & 3 ) )
return AVERROR_INVALIDDATA ;
if ( ( fmt_size = avio_read ( pb , fmt , sizeof ( fmt ) ) ) < 0 )
return fmt_size ;
if ( fmt_size = = sizeof ( deep_rgb24 ) & & ! memcmp ( fmt , deep_rgb24 , sizeof ( deep_rgb24 ) ) )
st - > codec - > pix_fmt = PIX_FMT_RGB24 ;
else if ( fmt_size = = sizeof ( deep_rgba ) & & ! memcmp ( fmt , deep_rgba , sizeof ( deep_rgba ) ) )
st - > codec - > pix_fmt = PIX_FMT_RGBA ;
else {
av_log_ask_for_sample ( NULL , " unsupported color format \n " ) ;
return AVERROR_PATCHWELCOME ;
}
break ;
case ID_DGBL :
st - > codec - > codec_type = AVMEDIA_TYPE_VIDEO ;
if ( data_size < 8 )
return AVERROR_INVALIDDATA ;
st - > codec - > width = avio_rb16 ( pb ) ;
st - > codec - > height = avio_rb16 ( pb ) ;
iff - > bitmap_compression = avio_rb16 ( pb ) ;
if ( iff - > bitmap_compression ! = 0 ) {
av_log ( s , AV_LOG_ERROR ,
" compression %i not supported \n " , iff - > bitmap_compression ) ;
return AVERROR_PATCHWELCOME ;
}
st - > sample_aspect_ratio . num = avio_r8 ( pb ) ;
st - > sample_aspect_ratio . den = avio_r8 ( pb ) ;
st - > codec - > bits_per_coded_sample = 24 ;
break ;
case ID_ANNO :
case ID_TEXT : metadata_tag = " comment " ; break ;
case ID_AUTH : metadata_tag = " artist " ; break ;