diff options
author | James Almer <jamrial@gmail.com> | 2020-08-13 14:06:44 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2020-08-14 00:02:29 -0300 |
commit | 3105e970503e77f11a9d8139d38b73abe25907a9 (patch) | |
tree | f2dc28b2b1207698176363ccc0681f743f53d540 | |
parent | 9a7bdb6d711c160734b498b6ba1a7b8fb6c230ec (diff) | |
download | ffmpeg-3105e970503e77f11a9d8139d38b73abe25907a9.tar.gz |
avformat/av1dec: add missing preprocessor wrappers to annexb and obu demuxers
Ensure the modules are compiled only if enabled.
Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | libavformat/av1dec.c | 184 |
1 files changed, 94 insertions, 90 deletions
diff --git a/libavformat/av1dec.c b/libavformat/av1dec.c index 3fa8764387..ee5b0fd0fc 100644 --- a/libavformat/av1dec.c +++ b/libavformat/av1dec.c @@ -29,6 +29,70 @@ #include "avio_internal.h" #include "internal.h" +//return < 0 if we need more data +static int get_score(int type, int *seq) +{ + switch (type) { + case AV1_OBU_SEQUENCE_HEADER: + *seq = 1; + return -1; + case AV1_OBU_FRAME: + case AV1_OBU_FRAME_HEADER: + return *seq ? AVPROBE_SCORE_EXTENSION + 1 : 0; + case AV1_OBU_METADATA: + case AV1_OBU_PADDING: + return -1; + default: + break; + } + return 0; +} + +static int read_header(AVFormatContext *s, const AVRational *framerate, AVBSFContext **bsf, void *logctx) +{ + const AVBitStreamFilter *filter = av_bsf_get_by_name("av1_frame_merge"); + AVStream *st; + int ret; + + if (!filter) { + av_log(logctx, AV_LOG_ERROR, "av1_frame_merge bitstream filter " + "not found. This is a bug, please report it.\n"); + return AVERROR_BUG; + } + + st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + + st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; + st->codecpar->codec_id = AV_CODEC_ID_AV1; + st->need_parsing = AVSTREAM_PARSE_HEADERS; + + st->internal->avctx->framerate = *framerate; + // taken from rawvideo demuxers + avpriv_set_pts_info(st, 64, 1, 1200000); + + ret = av_bsf_alloc(filter, bsf); + if (ret < 0) + return ret; + + ret = avcodec_parameters_copy((*bsf)->par_in, st->codecpar); + if (ret < 0) { + av_bsf_free(bsf); + return ret; + } + + ret = av_bsf_init(*bsf); + if (ret < 0) + av_bsf_free(bsf); + + return ret; + +} + +#define DEC AV_OPT_FLAG_DECODING_PARAM + +#if CONFIG_AV1_DEMUXER typedef struct AnnexBContext { const AVClass *class; AVBSFContext *bsf; @@ -71,25 +135,6 @@ static int read_obu(const uint8_t *buf, int size, int64_t *obu_size, int *type) return 0; } -//return < 0 if we need more data -static int get_score(int type, int *seq) -{ - switch (type) { - case AV1_OBU_SEQUENCE_HEADER: - *seq = 1; - return -1; - case AV1_OBU_FRAME: - case AV1_OBU_FRAME_HEADER: - return *seq ? AVPROBE_SCORE_EXTENSION + 1 : 0; - case AV1_OBU_METADATA: - case AV1_OBU_PADDING: - return -1; - default: - break; - } - return 0; -} - static int annexb_probe(const AVProbeData *p) { AVIOContext pb; @@ -154,48 +199,6 @@ static int annexb_probe(const AVProbeData *p) return 0; } -static int read_header(AVFormatContext *s, const AVRational *framerate, AVBSFContext **bsf, void *logctx) -{ - const AVBitStreamFilter *filter = av_bsf_get_by_name("av1_frame_merge"); - AVStream *st; - int ret; - - if (!filter) { - av_log(logctx, AV_LOG_ERROR, "av1_frame_merge bitstream filter " - "not found. This is a bug, please report it.\n"); - return AVERROR_BUG; - } - - st = avformat_new_stream(s, NULL); - if (!st) - return AVERROR(ENOMEM); - - st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; - st->codecpar->codec_id = AV_CODEC_ID_AV1; - st->need_parsing = AVSTREAM_PARSE_HEADERS; - - st->internal->avctx->framerate = *framerate; - // taken from rawvideo demuxers - avpriv_set_pts_info(st, 64, 1, 1200000); - - ret = av_bsf_alloc(filter, bsf); - if (ret < 0) - return ret; - - ret = avcodec_parameters_copy((*bsf)->par_in, st->codecpar); - if (ret < 0) { - av_bsf_free(bsf); - return ret; - } - - ret = av_bsf_init(*bsf); - if (ret < 0) - av_bsf_free(bsf); - - return ret; - -} - static int annexb_read_header(AVFormatContext *s) { AnnexBContext *c = s->priv_data; @@ -267,6 +270,35 @@ static int annexb_read_close(AVFormatContext *s) return 0; } +#define OFFSET(x) offsetof(AnnexBContext, x) +static const AVOption annexb_options[] = { + { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC}, + { NULL }, +}; +#undef OFFSET + +static const AVClass annexb_demuxer_class = { + .class_name = "AV1 Annex B demuxer", + .item_name = av_default_item_name, + .option = annexb_options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVInputFormat ff_av1_demuxer = { + .name = "av1", + .long_name = NULL_IF_CONFIG_SMALL("AV1 Annex B"), + .priv_data_size = sizeof(AnnexBContext), + .read_probe = annexb_probe, + .read_header = annexb_read_header, + .read_packet = annexb_read_packet, + .read_close = annexb_read_close, + .extensions = "obu", + .flags = AVFMT_GENERIC_INDEX, + .priv_class = &annexb_demuxer_class, +}; +#endif + +#if CONFIG_OBU_DEMUXER typedef struct ObuContext { const AVClass *class; AVBSFContext *bsf; @@ -439,15 +471,6 @@ static int obu_read_close(AVFormatContext *s) return 0; } -#define DEC AV_OPT_FLAG_DECODING_PARAM - -#define OFFSET(x) offsetof(AnnexBContext, x) -static const AVOption annexb_options[] = { - { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC}, - { NULL }, -}; -#undef OFFSET - #define OFFSET(x) offsetof(ObuContext, x) static const AVOption obu_options[] = { { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC}, @@ -455,26 +478,6 @@ static const AVOption obu_options[] = { }; #undef OFFSET -static const AVClass annexb_demuxer_class = { - .class_name = "AV1 Annex B demuxer", - .item_name = av_default_item_name, - .option = annexb_options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVInputFormat ff_av1_demuxer = { - .name = "av1", - .long_name = NULL_IF_CONFIG_SMALL("AV1 Annex B"), - .priv_data_size = sizeof(AnnexBContext), - .read_probe = annexb_probe, - .read_header = annexb_read_header, - .read_packet = annexb_read_packet, - .read_close = annexb_read_close, - .extensions = "obu", - .flags = AVFMT_GENERIC_INDEX, - .priv_class = &annexb_demuxer_class, -}; - static const AVClass obu_demuxer_class = { .class_name = "AV1 low overhead OBU demuxer", .item_name = av_default_item_name, @@ -494,3 +497,4 @@ AVInputFormat ff_obu_demuxer = { .flags = AVFMT_GENERIC_INDEX, .priv_class = &obu_demuxer_class, }; +#endif |