diff --git a/libavformat/argo_brp.c b/libavformat/argo_brp.c index a60de59f64..613f04aef2 100644 --- a/libavformat/argo_brp.c +++ b/libavformat/argo_brp.c @@ -33,13 +33,16 @@ #define BRP_STREAM_HEADER_SIZE 20 #define BRP_MAX_STREAMS 32 /* Soft cap, but even this is overkill. */ #define BVID_HEADER_SIZE 16 -#define BRP_MIN_BUFFER_SIZE FFMAX(FFMAX3(BRP_FILE_HEADER_SIZE, \ +#define MASK_HEADER_SIZE 12 +#define BRP_MIN_BUFFER_SIZE FFMAX3(FFMAX3(BRP_FILE_HEADER_SIZE, \ BRP_BLOCK_HEADER_SIZE, \ BRP_STREAM_HEADER_SIZE), \ - BVID_HEADER_SIZE) + BVID_HEADER_SIZE, \ + MASK_HEADER_SIZE) #define BRP_CODEC_ID_BVID MKTAG('B', 'V', 'I', 'D') #define BRP_CODEC_ID_BASF MKTAG('B', 'A', 'S', 'F') +#define BRP_CODEC_ID_MASK MKTAG('M', 'A', 'S', 'K') typedef struct ArgoBRPFileHeader { uint32_t magic; @@ -60,6 +63,12 @@ typedef struct ArgoBVIDHeader { uint32_t depth; } ArgoBVIDHeader; +typedef struct ArgoMASKHeader { + uint32_t num_frames; + uint32_t width; + uint32_t height; +} ArgoMASKHeader; + typedef struct ArgoBRPStreamHeader { uint32_t codec_id; uint32_t id; @@ -72,6 +81,8 @@ typedef struct ArgoBRPStreamHeader { ArgoBVIDHeader bvid; /* If codec_id == BRP_CODEC_ID_BASF */ ArgoASFFileHeader basf; + /* If codec_id == BRP_CODEC_ID_MASK */ + ArgoMASKHeader mask; } extradata; } ArgoBRPStreamHeader; @@ -106,6 +117,9 @@ static int read_extradata(AVFormatContext *s, const ArgoBRPStreamHeader *hdr, } else if (hdr->codec_id == BRP_CODEC_ID_BASF) { name = "BASF"; size = ASF_FILE_HEADER_SIZE; + } else if (hdr->codec_id == BRP_CODEC_ID_MASK) { + name = "MASK"; + size = MASK_HEADER_SIZE; } else { avpriv_request_sample(s, "BRP codec id 0x%x", hdr->codec_id); @@ -240,7 +254,16 @@ static int argo_brp_read_header(AVFormatContext *s) if ((ret = ff_argo_asf_validate_file_header(s, &hdr->extradata.basf)) < 0) return ret; + } else if (hdr->codec_id == BRP_CODEC_ID_MASK) { + ArgoMASKHeader *mask = &hdr->extradata.mask; + st->codecpar->codec_type = AVMEDIA_TYPE_DATA; + + mask->num_frames = AV_RL32(buf + 0); + mask->width = AV_RL32(buf + 4); + mask->height = AV_RL32(buf + 8); + + st->nb_frames = mask->num_frames; } else { av_assert0(0); /* Caught above, should never happen. */ }