+
+#define DECLARE_MEDIACODEC_VCLASS(short_name) \
+static const AVClass ff_##short_name##_mediacodec_dec_class = { \
+ .class_name = #short_name "_mediacodec", \
+ .item_name = av_default_item_name, \
+ .option = ff_mediacodec_vdec_options, \
+ .version = LIBAVUTIL_VERSION_INT, \
+};
+
+#define DECLARE_MEDIACODEC_VDEC(short_name, full_name, codec_id, bsf) \
+DECLARE_MEDIACODEC_VCLASS(short_name) \
+AVCodec ff_##short_name##_mediacodec_decoder = { \
+ .name = #short_name "_mediacodec", \
+ .long_name = NULL_IF_CONFIG_SMALL(full_name " Android MediaCodec decoder"), \
+ .type = AVMEDIA_TYPE_VIDEO, \
+ .id = codec_id, \
+ .priv_class = &ff_##short_name##_mediacodec_dec_class, \
+ .priv_data_size = sizeof(MediaCodecH264DecContext), \
+ .init = mediacodec_decode_init, \
+ .receive_frame = mediacodec_receive_frame, \
+ .flush = mediacodec_decode_flush, \
+ .close = mediacodec_decode_close, \
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \
+ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, \
+ .bsfs = bsf, \
+ .hw_configs = mediacodec_hw_configs, \
+ .wrapper_name = "mediacodec", \
+}; \
+
+#if CONFIG_H264_MEDIACODEC_DECODER
+DECLARE_MEDIACODEC_VDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb")