[options]
girs_directories = ["../gir-files", "../gst-gir-files"]
library = "GstPbutils"
version = "1.0"
min_cfg_version = "1.14"
work_mode = "normal"
concurrency = "send+sync"
generate_safety_asserts = true
single_version_file = true
generate_display_trait = false
trust_return_value_nullability = true

external_libraries = [
    "GLib",
    "GObject",
    "Gst",
]

generate = [
    "GstPbutils.AudioVisualizer",
    "GstPbutils.AudioVisualizerShader",
    "GstPbutils.DiscovererInfo",
    "GstPbutils.DiscovererResult",
    "GstPbutils.PbUtilsCapsDescriptionFlags",
]

manual = [
    "GLib.DateTime",
    "GLib.Error",
    "GLib.MainContext",
    "GLib.MainLoop",
    "GLib.Source",
    "GLib.Type",
    "GLib.Variant",
    "GObject.Object",
    "Gst.Element",
    "Gst.Object",
    "Gst.Preset",
]

[[object]]
name = "Gst.Buffer"
status = "manual"
ref_mode = "ref"

[[object]]
name = "Gst.Caps"
status = "manual"
ref_mode = "ref"

[[object]]
name = "Gst.ClockTime"
status = "manual"
conversion_type = "Option"

[[object]]
name = "Gst.Event"
status = "manual"
ref_mode = "ref"

[[object]]
name = "Gst.Message"
status = "manual"
ref_mode = "ref"

[[object]]
name = "Gst.Structure"
status = "manual"
ref_mode = "ref"

[[object]]
name = "Gst.TagList"
status = "manual"
ref_mode = "ref"


[[object]]
name = "Gst.Toc"
status = "manual"
ref_mode = "ref"

[[object]]
name = "GstPbutils.*"
status = "generate"
    # We'll opt-in for constants at a later time
    [[object.constant]]
    pattern = ".+"
    ignore = true

    [[object.function]]
    pattern = "codec_utils_(aac_caps_set_level_and_profile|h264_caps_set_level_and_profile|h265_caps_set_level_tier_and_profile|mpeg4video_caps_set_level_and_profile)"
    # Needs mutable caps references and checks for the caps
    manual = true

    [[object.function]]
    name = "codec_utils_aac_get_level"
        [object.function.return]
        nullable_return_is_error = "Failed to get AAC level"

    [[object.function]]
    name = "codec_utils_aac_get_profile"
        [object.function.return]
        nullable_return_is_error = "Failed to get AAC profile"

    [[object.function]]
    name = "codec_utils_h264_get_level"
        [object.function.return]
        nullable_return_is_error = "Failed to get H264 level"

    [[object.function]]
    name = "codec_utils_h264_get_profile"
        [object.function.return]
        nullable_return_is_error = "Failed to get H264 profile"

    [[object.function]]
    name = "codec_utils_h264_get_profile_flags_level"
    manual = true

    [[object.function]]
    name = "codec_utils_h265_get_level"
        [object.function.return]
        nullable_return_is_error = "Failed to get H265 level"

    [[object.function]]
    name = "codec_utils_h265_get_profile"
        [object.function.return]
        nullable_return_is_error = "Failed to get H265 profile"

    [[object.function]]
    name = "codec_utils_h265_get_tier"
        [object.function.return]
        nullable_return_is_error = "Failed to get H265 tier"

    [[object.function]]
    name = "codec_utils_mpeg4video_get_level"
        [object.function.return]
        nullable_return_is_error = "Failed to get MPEG4 video level"

    [[object.function]]
    name = "codec_utils_mpeg4video_get_profile"
        [object.function.return]
        nullable_return_is_error = "Failed to get MPEG4 video profile"

    [[object.function]]
    name = "codec_utils_caps_get_mime_codec"
        [object.function.return]
        nullable_return_is_error = "Unsupported caps"

    [[object.function]]
    name = "codec_utils_opus_create_caps_from_header"
        [object.function.return]
        nullable_return_is_error = "Failed to create caps from Opus headers"

    [[object.function]]
    name = "codec_utils_opus_create_caps"
    # Manual checks
    manual = true

    [[object.function]]
    name = "codec_utils_opus_create_header"
    # Manual checks
    manual = true

    [[object.function]]
    name = "codec_utils_opus_parse_caps"
    # Manual checks
    manual = true

    [[object.function]]
    name = "codec_utils_opus_parse_header"
    # Manual checks
    manual = true

    # Plugin installer API needs some manual impls
    [[object.function]]
    pattern = "install_plugins.*"
    ignore = true

    # Plugin installer API needs some manual impls
    [[object.function]]
    pattern = "missing_.*"
    ignore = true

    # Plugin installer API needs some manual impls
    [[object.function]]
    name = "is_missing_plugin_message"
    ignore = true

    # Initialization is handled implicitely
    [[object.function]]
    name = "pb_utils_init"
    ignore = true

    # Needs special handling for mutable taglists
    [[object.function]]
    name = "pb_utils_add_codec_description_to_tag_list"
    ignore = true

    # Needs special handling for caps refs
    [[object.function]]
    name = "pb_utils_get_codec_description"
    ignore = true

    # Needs special handling for caps refs
    [[object.function]]
    name = "pb_utils_get_decoder_description"
    ignore = true

    # Needs special handling for caps refs
    [[object.function]]
    name = "pb_utils_get_encoder_description"
    ignore = true

    [[object.function]]
    name = "plugins_base_version_string"
    assertion = "skip"

    [[object.function]]
    name = "plugins_base_version"
    assertion = "skip"

[[object]]
name = "GstPbutils.Discoverer"
status = "generate"
final_type = true

    [[object.function]]
    name = "discover_uri_async"
        [object.function.return]
        bool_return_is_error = "Failed to add URI to list of discovers"

    [[object.function]]
    name = "new"
        [[object.function.parameter]]
        name = "timeout"
        mandatory = true

    # Manually implemented to use ClockTime
    [[object.property]]
    name = "timeout"
    manual = true

    [[object.property]]
    name = "use-cache"
    version = "1.16"

[[object]]
name = "GstPbutils.DiscovererAudioInfo"
status = "generate"
final_type = true

[[object]]
name = "GstPbutils.DiscovererContainerInfo"
status = "generate"
final_type = true

[[object]]
name = "GstPbutils.DiscovererSerializeFlags"
status = "generate"
    [[object.member]]
    name = "basic"
    ignore = true
    [[object.member]]
    name = "all"
    ignore = true

[[object]]
name = "GstPbutils.DiscovererStreamInfo"
status = "generate"
final_type = false

    # Not useful
    [[object.function]]
    name = "list_free"
    ignore = true

[[object]]
name = "GstPbutils.DiscovererSubtitleInfo"
status = "generate"
final_type = true

[[object]]
name = "GstPbutils.DiscovererVideoInfo"
status = "generate"
final_type = true

    # Implement manually to expose as gst::Fraction
    [[object.function]]
    name = "get_framerate_num"
    manual = true
    [[object.function]]
    name = "get_framerate_denom"
    manual = true
    [[object.function]]
    name = "get_par_num"
    manual = true
    [[object.function]]
    name = "get_par_denom"
    manual = true

[[object]]
name = "GstPbutils.EncodingAudioProfile"
status = "generate"
final_type = true
    # Ignore all setters, making it immutable. A builder will be provided.
    [[object.function]]
    name = "new"
    manual = true
    [[object.function]]
    pattern = "set_.*"
    manual = true

[[object]]
name = "GstPbutils.EncodingContainerProfile"
status = "generate"

    # Make it immutable, only able to be constructed for a builder
    [[object.function]]
    name = "new"
    manual = true

    [[object.function]]
    name = "add_profile"
    manual = true

[[object]]
name = "GstPbutils.EncodingProfile"
status = "generate"

    # Ignore all setters, making it immutable. A builder will be provided.
    [[object.function]]
    name = "new"
    manual = true
    [[object.function]]
    pattern = "set_.*"
    manual = true

    [[object.function]]
    pattern = "get_restriction"
    manual = true

    [[object.function]]
    name = "get_element_properties"
    # Use custom wrapper types
    manual = true

    [[object.property]]
    name = "restriction-caps"
    # encodingprofile is immutable after constructed
    ignore = true

    [[object.function]]
    name = "from_discoverer"
        [object.function.return]
        nullable_return_is_error = "Failed to create EncodingProfile from DiscovererInfo"

[[object]]
name = "GstPbutils.EncodingTarget"
status = "generate"

    [[object.function]]
    name = "add_profile"
    # can be provided on constructor and we better
    # consider this immutable
    ignore = true

    [[object.function]]
    name = "new"
        [object.function.return]
        nullable_return_is_error = "Failed to create EncodingTarget"

[[object]]
name = "GstPbutils.EncodingVideoProfile"
status = "generate"
final_type = true
    # Ignore all setters, making it immutable. A builder will be provided.
    [[object.function]]
    name = "new"
    manual = true
    [[object.function]]
    pattern = "set_.*"
    manual = true
