cdxl: add read_probe function
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
6e625d4198
commit
992a6a53ef
@ -38,6 +38,48 @@ typedef struct CDXLDemuxContext {
|
||||
int audio_stream_index;
|
||||
} CDXLDemuxContext;
|
||||
|
||||
static int cdxl_read_probe(AVProbeData *p)
|
||||
{
|
||||
int score = AVPROBE_SCORE_MAX / 2 + 10;
|
||||
|
||||
if (p->buf_size < CDXL_HEADER_SIZE)
|
||||
return 0;
|
||||
|
||||
/* reserved bytes should always be set to 0 */
|
||||
if (AV_RN64(&p->buf[24]) || AV_RN16(&p->buf[10]))
|
||||
return 0;
|
||||
|
||||
/* check type */
|
||||
if (p->buf[0] != 1)
|
||||
return 0;
|
||||
|
||||
/* check palette size */
|
||||
if (AV_RB16(&p->buf[20]) > 512)
|
||||
return 0;
|
||||
|
||||
/* check number of planes */
|
||||
if (p->buf[18] || !p->buf[19])
|
||||
return 0;
|
||||
|
||||
/* check widh and height */
|
||||
if (!AV_RN16(&p->buf[14]) || !AV_RN16(&p->buf[16]))
|
||||
return 0;
|
||||
|
||||
/* chunk size */
|
||||
if (AV_RB32(&p->buf[2]) < AV_RB16(&p->buf[22]) + AV_RB16(&p->buf[20]) + CDXL_HEADER_SIZE)
|
||||
return 0;
|
||||
|
||||
/* previous chunk size */
|
||||
if (AV_RN32(&p->buf[6]))
|
||||
score /= 2;
|
||||
|
||||
/* current frame number, usually starts from 1 */
|
||||
if (AV_RB16(&p->buf[12]) != 1)
|
||||
score /= 2;
|
||||
|
||||
return score;
|
||||
}
|
||||
|
||||
static int cdxl_read_header(AVFormatContext *s)
|
||||
{
|
||||
CDXLDemuxContext *cdxl = s->priv_data;
|
||||
@ -173,6 +215,7 @@ AVInputFormat ff_cdxl_demuxer = {
|
||||
.name = "cdxl",
|
||||
.long_name = NULL_IF_CONFIG_SMALL("Commodore CDXL video"),
|
||||
.priv_data_size = sizeof(CDXLDemuxContext),
|
||||
.read_probe = cdxl_read_probe,
|
||||
.read_header = cdxl_read_header,
|
||||
.read_packet = cdxl_read_packet,
|
||||
.extensions = "cdxl,xl",
|
||||
|
Loading…
x
Reference in New Issue
Block a user