summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZane van Iperen <zane@zanevaniperen.com>2020-09-25 22:39:46 +1000
committerZane van Iperen <zane@zanevaniperen.com>2020-09-27 09:11:34 +1000
commit2e7752affff242030edd016946289dc55eb0d617 (patch)
tree8052d67fd74d99078ffdf6ae749cf7f40d5ec3be
parentebfed56858d5fc57f0b4bad7e08e9e89258702ba (diff)
avformat/argo_brp: support MASK streams
We can't actually use them though. Signed-off-by: Zane van Iperen <zane@zanevaniperen.com>
-rw-r--r--libavformat/argo_brp.c27
1 files changed, 25 insertions, 2 deletions
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. */
}