# `Membrane.Filter`
[🔗](https://github.com/membraneframework/membrane-core/blob/v1.2.7/lib/membrane/filter.ex#L1)

Module defining behaviour for filters - elements processing data.

Behaviours for filters are specified, besides this place, in modules
`Membrane.Element.Base`,
`Membrane.Element.WithOutputPads`,
and `Membrane.Element.WithInputPads`.

Filters can have both input and output pads. Job of a usual filter is to
receive some data on a input pad, process the data and send it through the
output pad. If the pad has the flow control set to `:manual`, then filter
is also responsible for receiving demands on the output pad and requesting
them on the input pad (for more details, see
`c:Membrane.Element.WithOutputPads.handle_demand/5` callback).
Filters, like all elements, can of course have multiple pads if needed to
provide more complex solutions.

## List of available callbacks
Below there is a list of all the callbacks available in a module, that implements `Membrane.Filter` behaviour.
We have put it for your convenience, as some of these callbacks aren't directly defined in that module and
their specification is available in different modules.

The callbacks available in `Membrane.Filter` behaviour:

`Membrane.Element.Base`
* `c:Membrane.Element.Base.__struct__/0`
* `c:Membrane.Element.Base.__struct__/1`
* `c:Membrane.Element.Base.handle_event/4`
* `c:Membrane.Element.Base.handle_info/3`
* `c:Membrane.Element.Base.handle_init/2`
* `c:Membrane.Element.Base.handle_pad_added/3`
* `c:Membrane.Element.Base.handle_pad_removed/3`
* `c:Membrane.Element.Base.handle_parent_notification/3`
* `c:Membrane.Element.Base.handle_playing/2`
* `c:Membrane.Element.Base.handle_setup/2`
* `c:Membrane.Element.Base.handle_terminate_request/2`
* `c:Membrane.Element.Base.handle_tick/3`

`Membrane.Element.WithInputPads`
* `c:Membrane.Element.WithInputPads.handle_buffer/4`
* `c:Membrane.Element.WithInputPads.handle_end_of_stream/3`
* `c:Membrane.Element.WithInputPads.handle_start_of_stream/3`
* `c:Membrane.Element.WithInputPads.handle_stream_format/4`

`Membrane.Element.WithOutputPads`
* `c:Membrane.Element.WithOutputPads.handle_demand/5`

# `__using__`
*macro* 

Brings all the stuff necessary to implement a filter element.

Options:
  - `:bring_pad?` - if true (default) requires and aliases `Membrane.Pad`
  - `:flow_control_hints?` - if true (default) generates compile-time warnings     if the number, direction, and type of flow control of pads are likely to cause unintended     behaviours.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
