diff --git a/libavformat/ac3dec.c b/libavformat/ac3dec.c index 3736b118d3..1f87939388 100644 --- a/libavformat/ac3dec.c +++ b/libavformat/ac3dec.c @@ -102,6 +102,7 @@ static int ac3_probe(const AVProbeData *p) return ac3_eac3_probe(p, AV_CODEC_ID_AC3); } +FF_RAW_DEMUXER_CLASS(ac3) AVInputFormat ff_ac3_demuxer = { .name = "ac3", .long_name = NULL_IF_CONFIG_SMALL("raw AC-3"), @@ -111,6 +112,8 @@ AVInputFormat ff_ac3_demuxer = { .flags= AVFMT_GENERIC_INDEX, .extensions = "ac3", .raw_codec_id = AV_CODEC_ID_AC3, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &ac3_demuxer_class, }; #endif @@ -120,6 +123,7 @@ static int eac3_probe(const AVProbeData *p) return ac3_eac3_probe(p, AV_CODEC_ID_EAC3); } +FF_RAW_DEMUXER_CLASS(eac3) AVInputFormat ff_eac3_demuxer = { .name = "eac3", .long_name = NULL_IF_CONFIG_SMALL("raw E-AC-3"), @@ -129,5 +133,7 @@ AVInputFormat ff_eac3_demuxer = { .flags = AVFMT_GENERIC_INDEX, .extensions = "eac3", .raw_codec_id = AV_CODEC_ID_EAC3, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &eac3_demuxer_class, }; #endif diff --git a/libavformat/acm.c b/libavformat/acm.c index 125352a8f6..5e03cf8bff 100644 --- a/libavformat/acm.c +++ b/libavformat/acm.c @@ -60,6 +60,7 @@ static int acm_read_header(AVFormatContext *s) return 0; } +FF_RAW_DEMUXER_CLASS(acm) AVInputFormat ff_acm_demuxer = { .name = "acm", .long_name = NULL_IF_CONFIG_SMALL("Interplay ACM"), @@ -69,4 +70,6 @@ AVInputFormat ff_acm_demuxer = { .flags = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK | AVFMT_NOTIMESTAMPS, .extensions = "acm", .raw_codec_id = AV_CODEC_ID_INTERPLAY_ACM, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &acm_demuxer_class, }; diff --git a/libavformat/dtsdec.c b/libavformat/dtsdec.c index 8ec7925c59..ab59a56dfc 100644 --- a/libavformat/dtsdec.c +++ b/libavformat/dtsdec.c @@ -127,6 +127,7 @@ static int dts_probe(const AVProbeData *p) return 0; } +FF_RAW_DEMUXER_CLASS(dts) AVInputFormat ff_dts_demuxer = { .name = "dts", .long_name = NULL_IF_CONFIG_SMALL("raw DTS"), @@ -136,4 +137,5 @@ AVInputFormat ff_dts_demuxer = { .flags = AVFMT_GENERIC_INDEX, .extensions = "dts", .raw_codec_id = AV_CODEC_ID_DTS, -}; + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &dts_demuxer_class,}; diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c index ea803f57dd..8394e47483 100644 --- a/libavformat/flacdec.c +++ b/libavformat/flacdec.c @@ -31,6 +31,8 @@ #define SEEKPOINT_SIZE 18 typedef struct FLACDecContext { + AVClass *class; + int raw_packet_size; int found_seektable; } FLACDecContext; @@ -327,6 +329,7 @@ static int flac_seek(AVFormatContext *s, int stream_index, int64_t timestamp, in return -1; } +FF_RAW_DEMUXER_CLASS(flac) AVInputFormat ff_flac_demuxer = { .name = "flac", .long_name = NULL_IF_CONFIG_SMALL("raw FLAC"), @@ -339,4 +342,5 @@ AVInputFormat ff_flac_demuxer = { .extensions = "flac", .raw_codec_id = AV_CODEC_ID_FLAC, .priv_data_size = sizeof(FLACDecContext), + .priv_class = &flac_demuxer_class, }; diff --git a/libavformat/g722.c b/libavformat/g722.c index 2feec01211..fe8c4ae7bb 100644 --- a/libavformat/g722.c +++ b/libavformat/g722.c @@ -46,6 +46,7 @@ static int g722_read_header(AVFormatContext *s) return 0; } +FF_RAW_DEMUXER_CLASS(g722) AVInputFormat ff_g722_demuxer = { .name = "g722", .long_name = NULL_IF_CONFIG_SMALL("raw G.722"), @@ -54,4 +55,5 @@ AVInputFormat ff_g722_demuxer = { .flags = AVFMT_GENERIC_INDEX, .extensions = "g722,722", .raw_codec_id = AV_CODEC_ID_ADPCM_G722, -}; + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &g722_demuxer_class,}; diff --git a/libavformat/loasdec.c b/libavformat/loasdec.c index c7e124e340..e166a5928a 100644 --- a/libavformat/loasdec.c +++ b/libavformat/loasdec.c @@ -83,6 +83,7 @@ static int loas_read_header(AVFormatContext *s) return 0; } +FF_RAW_DEMUXER_CLASS(loas) AVInputFormat ff_loas_demuxer = { .name = "loas", .long_name = NULL_IF_CONFIG_SMALL("LOAS AudioSyncStream"), @@ -91,4 +92,6 @@ AVInputFormat ff_loas_demuxer = { .read_packet = ff_raw_read_partial_packet, .flags= AVFMT_GENERIC_INDEX, .raw_codec_id = AV_CODEC_ID_AAC_LATM, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &loas_demuxer_class, }; diff --git a/libavformat/mlpdec.c b/libavformat/mlpdec.c index e210d7d52e..40b1833761 100644 --- a/libavformat/mlpdec.c +++ b/libavformat/mlpdec.c @@ -56,6 +56,7 @@ static int mlp_probe(const AVProbeData *p) return mlp_thd_probe(p, 0xf8726fbb); } +FF_RAW_DEMUXER_CLASS(mlp) AVInputFormat ff_mlp_demuxer = { .name = "mlp", .long_name = NULL_IF_CONFIG_SMALL("raw MLP"), @@ -65,6 +66,8 @@ AVInputFormat ff_mlp_demuxer = { .flags = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS, .extensions = "mlp", .raw_codec_id = AV_CODEC_ID_MLP, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &mlp_demuxer_class, }; #endif @@ -74,6 +77,7 @@ static int thd_probe(const AVProbeData *p) return mlp_thd_probe(p, 0xf8726fba); } +FF_RAW_DEMUXER_CLASS(truehd) AVInputFormat ff_truehd_demuxer = { .name = "truehd", .long_name = NULL_IF_CONFIG_SMALL("raw TrueHD"), @@ -83,6 +87,8 @@ AVInputFormat ff_truehd_demuxer = { .flags = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS, .extensions = "thd", .raw_codec_id = AV_CODEC_ID_TRUEHD, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &truehd_demuxer_class, }; #endif diff --git a/libavformat/rawdec.c b/libavformat/rawdec.c index c602e539f5..59b49e3f77 100644 --- a/libavformat/rawdec.c +++ b/libavformat/rawdec.c @@ -34,9 +34,10 @@ int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) { + FFRawDemuxerContext *raw = s->priv_data; int ret, size; - size = RAW_PACKET_SIZE; + size = raw->raw_packet_size; if (av_new_packet(pkt, size) < 0) return AVERROR(ENOMEM); @@ -119,10 +120,17 @@ int ff_raw_data_read_header(AVFormatContext *s) #define DEC AV_OPT_FLAG_DECODING_PARAM const AVOption ff_rawvideo_options[] = { { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC}, + { "raw_packet_size", "", OFFSET(raw_packet_size), AV_OPT_TYPE_INT, {.i64 = RAW_PACKET_SIZE }, 1, INT_MAX, DEC}, + { NULL }, +}; +const AVOption ff_raw_options[] = { + { "raw_packet_size", "", OFFSET(raw_packet_size), AV_OPT_TYPE_INT, {.i64 = RAW_PACKET_SIZE }, 1, INT_MAX, DEC}, { NULL }, }; #if CONFIG_DATA_DEMUXER +FF_RAW_DEMUXER_CLASS(raw_data) + AVInputFormat ff_data_demuxer = { .name = "data", .long_name = NULL_IF_CONFIG_SMALL("raw data"), @@ -130,6 +138,8 @@ AVInputFormat ff_data_demuxer = { .read_packet = ff_raw_read_partial_packet, .raw_codec_id = AV_CODEC_ID_NONE, .flags = AVFMT_NOTIMESTAMPS, + .priv_data_size = sizeof(FFRawDemuxerContext),\ + .priv_class = &raw_data_demuxer_class,\ }; #endif diff --git a/libavformat/rawdec.h b/libavformat/rawdec.h index 3eb416b8ee..85e0790c86 100644 --- a/libavformat/rawdec.h +++ b/libavformat/rawdec.h @@ -28,12 +28,19 @@ typedef struct FFRawVideoDemuxerContext { const AVClass *class; /**< Class for private options. */ + int raw_packet_size; char *video_size; /**< String describing video size, set by a private option. */ char *pixel_format; /**< Set by a private option. */ AVRational framerate; /**< AVRational describing framerate, set by a private option. */ } FFRawVideoDemuxerContext; +typedef struct FFRawDemuxerContext { + const AVClass *class; /**< Class for private options. */ + int raw_packet_size; +} FFRawDemuxerContext; + extern const AVOption ff_rawvideo_options[]; +extern const AVOption ff_raw_options[]; int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt); @@ -45,6 +52,14 @@ int ff_raw_subtitle_read_header(AVFormatContext *s); int ff_raw_data_read_header(AVFormatContext *s); +#define FF_RAW_DEMUXER_CLASS(name)\ +static const AVClass name ## _demuxer_class = {\ + .class_name = #name " demuxer",\ + .item_name = av_default_item_name,\ + .option = ff_raw_options,\ + .version = LIBAVUTIL_VERSION_INT,\ +}; + #define FF_RAWVIDEO_DEMUXER_CLASS(name)\ static const AVClass name ## _demuxer_class = {\ .class_name = #name " demuxer",\ @@ -75,7 +90,7 @@ FF_DEF_RAWVIDEO_DEMUXER2(shortname, longname, probe, ext, id, AVFMT_GENERIC_INDE static const AVClass name ## _demuxer_class = {\ .class_name = #name " demuxer",\ .item_name = av_default_item_name,\ - .option = NULL,\ + .option = ff_raw_options,\ .version = LIBAVUTIL_VERSION_INT,\ }; @@ -90,7 +105,7 @@ AVInputFormat ff_ ## shortname ## _demuxer = {\ .extensions = ext,\ .flags = flag,\ .raw_codec_id = id,\ - .priv_data_size = 0,\ + .priv_data_size = sizeof(FFRawDemuxerContext),\ .priv_class = &shortname ## _demuxer_class,\ }; diff --git a/libavformat/sbcdec.c b/libavformat/sbcdec.c index ae74a220dc..7a455ce123 100644 --- a/libavformat/sbcdec.c +++ b/libavformat/sbcdec.c @@ -22,6 +22,7 @@ #include "avformat.h" #include "rawdec.h" +FF_RAW_DEMUXER_CLASS(sbc) AVInputFormat ff_sbc_demuxer = { .name = "sbc", .long_name = NULL_IF_CONFIG_SMALL("raw SBC (low-complexity subband codec)"), @@ -30,4 +31,6 @@ AVInputFormat ff_sbc_demuxer = { .read_header = ff_raw_audio_read_header, .read_packet = ff_raw_read_partial_packet, .flags = AVFMT_GENERIC_INDEX, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &sbc_demuxer_class, }; diff --git a/libavformat/shortendec.c b/libavformat/shortendec.c index b02984a3f7..a2879dc5a3 100644 --- a/libavformat/shortendec.c +++ b/libavformat/shortendec.c @@ -59,6 +59,7 @@ static int shn_probe(const AVProbeData *p) return AVPROBE_SCORE_EXTENSION + 1; } +FF_RAW_DEMUXER_CLASS(shorten) AVInputFormat ff_shorten_demuxer = { .name = "shn", .long_name = NULL_IF_CONFIG_SMALL("raw Shorten"), @@ -68,4 +69,6 @@ AVInputFormat ff_shorten_demuxer = { .flags = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK | AVFMT_NOTIMESTAMPS, .extensions = "shn", .raw_codec_id = AV_CODEC_ID_SHORTEN, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &shorten_demuxer_class, }; diff --git a/libavformat/takdec.c b/libavformat/takdec.c index 5e0601806f..6d18b6af21 100644 --- a/libavformat/takdec.c +++ b/libavformat/takdec.c @@ -31,6 +31,8 @@ #include "rawdec.h" typedef struct TAKDemuxContext { + AVClass *class; + int raw_packet_size; int mlast_frame; int64_t data_end; } TAKDemuxContext; @@ -211,6 +213,7 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) return ret; } +FF_RAW_DEMUXER_CLASS(tak) AVInputFormat ff_tak_demuxer = { .name = "tak", .long_name = NULL_IF_CONFIG_SMALL("raw TAK"), @@ -221,4 +224,5 @@ AVInputFormat ff_tak_demuxer = { .flags = AVFMT_GENERIC_INDEX, .extensions = "tak", .raw_codec_id = AV_CODEC_ID_TAK, + .priv_class = &tak_demuxer_class, }; diff --git a/libavformat/wsddec.c b/libavformat/wsddec.c index 574addf620..2313b0ec4b 100644 --- a/libavformat/wsddec.c +++ b/libavformat/wsddec.c @@ -161,6 +161,7 @@ static int wsd_read_header(AVFormatContext *s) return avio_seek(pb, data_offset, SEEK_SET); } +FF_RAW_DEMUXER_CLASS(wsd) AVInputFormat ff_wsd_demuxer = { .name = "wsd", .long_name = NULL_IF_CONFIG_SMALL("Wideband Single-bit Data (WSD)"), @@ -170,4 +171,6 @@ AVInputFormat ff_wsd_demuxer = { .extensions = "wsd", .flags = AVFMT_GENERIC_INDEX | AVFMT_NO_BYTE_SEEK, .raw_codec_id = AV_CODEC_ID_DSD_MSBF, + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &wsd_demuxer_class, };