@chapter Bitstream Filters
@c man begin BITSTREAM FILTERS

When you configure your FFmpeg build, all the supported bitstream
filters are enabled by default. You can list all available ones using
the configure option @code{--list-bsfs}.

You can disable all the bitstream filters using the configure option
@code{--disable-bsfs}, and selectively enable any bitstream filter using
the option @code{--enable-bsf=BSF}, or you can disable a particular
bitstream filter using the option @code{--disable-bsf=BSF}.

The option @code{-bsfs} of the ff* tools will display the list of
all the supported bitstream filters included in your build.

The ff* tools have a -bsf option applied per stream, taking a
comma-separated list of filters, whose parameters follow the filter
name after a '='.

@example
ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1:opt2=str2][,filter2] OUTPUT
@end example

Below is a description of the currently available bitstream filters,
with their parameters, if any.

@section aac_adtstoasc

Convert MPEG-2/4 AAC ADTS to an MPEG-4 Audio Specific Configuration
bitstream.

This filter creates an MPEG-4 AudioSpecificConfig from an MPEG-2/4
ADTS header and removes the ADTS header.

This filter is required for example when copying an AAC stream from a
raw ADTS AAC or an MPEG-TS container to MP4A-LATM, to an FLV file, or
to MOV/MP4 files and related formats such as 3GP or M4A. Please note
that it is auto-inserted for MP4A-LATM and MOV/MP4 and related formats.

@section av1_metadata

Modify metadata embedded in an AV1 stream.

@table @option
@item td
Insert or remove temporal delimiter OBUs in all temporal units of the
stream.

@table @samp
@item insert
Insert a TD at the beginning of every TU which does not already have one.
@item remove
Remove the TD from the beginning of every TU which has one.
@end table

@item color_primaries
@item transfer_characteristics
@item matrix_coefficients
Set the color description fields in the stream (see AV1 section 6.4.2).

@item color_range
Set the color range in the stream (see AV1 section 6.4.2; note that
this cannot be set for streams using BT.709 primaries, sRGB transfer
characteristic and identity (RGB) matrix coefficients).
@table @samp
@item tv
Limited range.
@item pc
Full range.
@end table

@item chroma_sample_position
Set the chroma sample location in the stream (see AV1 section 6.4.2).
This can only be set for 4:2:0 streams.

@table @samp
@item vertical
Left position (matching the default in MPEG-2 and H.264).
@item colocated
Top-left position.
@end table

@item tick_rate
Set the tick rate (@emph{num_units_in_display_tick / time_scale}) in
the timing info in the sequence header.
@item num_ticks_per_picture
Set the number of ticks in each picture, to indicate that the stream
has a fixed framerate.  Ignored if @option{tick_rate} is not also set.

@item delete_padding
Deletes Padding OBUs.

@end table

@section chomp

Remove zero padding at the end of a packet.

@section dca_core

Extract the core from a DCA/DTS stream, dropping extensions such as
DTS-HD.

@section dump_extra

Add extradata to the beginning of the filtered packets except when
said packets already exactly begin with the extradata that is intended
to be added.

@table @option
@item freq
The additional argument specifies which packets should be filtered.
It accepts the values:
@table @samp
@item k
@item keyframe
add extradata to all key packets

@item e
@item all
add extradata to all packets
@end table
@end table

If not specified it is assumed @samp{k}.

For example the following @command{ffmpeg} command forces a global
header (thus disabling individual packet headers) in the H.264 packets
generated by the @code{libx264} encoder, but corrects them by adding
the header stored in extradata to the key packets:
@example
ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts
@end example

@section eac3_core

Extract the core from a E-AC-3 stream, dropping extra channels.

@section extract_extradata

Extract the in-band extradata.

Certain codecs allow the long-term headers (e.g. MPEG-2 sequence headers,
or H.264/HEVC (VPS/)SPS/PPS) to be transmitted either "in-band" (i.e. as a part
of the bitstream containing the coded frames) or "out of band" (e.g. on the
container level). This latter form is called "extradata" in FFmpeg terminology.

This bitstream filter detects the in-band headers and makes them available as
extradata.

@table @option
@item remove
When this option is enabled, the long-term headers are removed from the
bitstream after extraction.
@end table

@section filter_units

Remove units with types in or not in a given set from the stream.

@table @option
@item pass_types
List of unit types or ranges of unit types to pass through while removing
all others.  This is specified as a '|'-separated list of unit type values
or ranges of values with '-'.

@item remove_types
Identical to @option{pass_types}, except the units in the given set
removed and all others passed through.
@end table

Extradata is unchanged by this transformation, but note that if the stream
contains inline parameter sets then the output may be unusable if they are
removed.

For example, to remove all non-VCL NAL units from an H.264 stream:
@example
ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=pass_types=1-5' OUTPUT
@end example

To remove all AUDs, SEI and filler from an H.265 stream:
@example
ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=remove_types=35|38-40' OUTPUT
@end example

@section hapqa_extract

Extract Rgb or Alpha part of an HAPQA file, without recompression, in order to create an HAPQ or an HAPAlphaOnly file.

@table @option
@item texture
Specifies the texture to keep.

@table @option
@item color
@item alpha
@end table

@end table

Convert HAPQA to HAPQ
@example
ffmpeg -i hapqa_inputfile.mov -c copy -bsf:v hapqa_extract=texture=color -tag:v HapY -metadata:s:v:0 encoder="HAPQ" hapq_file.mov
@end example

Convert HAPQA to HAPAlphaOnly
@example
ffmpeg -i hapqa_inputfile.mov -c copy -bsf:v hapqa_extract=texture=alpha -tag:v HapA -metadata:s:v:0 encoder="HAPAlpha Only" hapalphaonly_file.mov
@end example

@section h264_metadata

Modify metadata embedded in an H.264 stream.

@table @option
@item aud
Insert or remove AUD NAL units in all access units of the stream.

@table @samp
@item insert
@item remove
@end table

@item sample_aspect_ratio
Set the sample aspect ratio of the stream in the VUI parameters.

@item overscan_appropriate_flag
Set whether the stream is suitable for display using overscan
or not (see H.264 section E.2.1).

@item video_format
@item video_full_range_flag
Set the video format in the stream (see H.264 section E.2.1 and
table E-2).

@item colour_primaries
@item transfer_characteristics
@item matrix_coefficients
Set the colour description in the stream (see H.264 section E.2.1
and tables E-3, E-4 and E-5).

@item chroma_sample_loc_type
Set the chroma sample location in the stream (see H.264 section
E.2.1 and figure E-1).

@item tick_rate
Set the tick rate (num_units_in_tick / time_scale) in the VUI
parameters.  This is the smallest time unit representable in the
stream, and in many cases represents the field rate of the stream
(double the frame rate).
@item fixed_frame_rate_flag
Set whether the stream has fixed framerate - typically this indicates
that the framerate is exactly half the tick rate, but the exact
meaning is dependent on interlacing and the picture structure (see
H.264 section E.2.1 and table E-6).

@item crop_left
@item crop_right
@item crop_top
@item crop_bottom
Set the frame cropping offsets in the SPS.  These values will replace
the current ones if the stream is already cropped.

These fields are set in pixels.  Note that some sizes may not be
representable if the chroma is subsampled or the stream is interlaced
(see H.264 section 7.4.2.1.1).

@item sei_user_data
Insert a string as SEI unregistered user data.  The argument must
be of the form @emph{UUID+string}, where the UUID is as hex digits
possibly separated by hyphens, and the string can be anything.

For example, @samp{086f3693-b7b3-4f2c-9653-21492feee5b8+hello} will
insert the string ``hello'' associated with the given UUID.

@item delete_filler
Deletes both filler NAL units and filler SEI messages.

@item level
Set the level in the SPS.  Refer to H.264 section A.3 and tables A-1
to A-5.

The argument must be the name of a level (for example, @samp{4.2}), a
level_idc value (for example, @samp{42}), or the special name @samp{auto}
indicating that the filter should attempt to guess the level from the
input stream properties.

@end table

@section h264_mp4toannexb

Convert an H.264 bitstream from length prefixed mode to start code
prefixed mode (as defined in the Annex B of the ITU-T H.264
specification).

This is required by some streaming formats, typically the MPEG-2
transport stream format (muxer @code{mpegts}).

For example to remux an MP4 file containing an H.264 stream to mpegts
format with @command{ffmpeg}, you can use the command:

@example
ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts
@end example

Please note that this filter is auto-inserted for MPEG-TS (muxer
@code{mpegts}) and raw H.264 (muxer @code{h264}) output formats.

@section h264_redundant_pps

This applies a specific fixup to some Blu-ray streams which contain
redundant PPSs modifying irrelevant parameters of the stream which
confuse other transformations which require correct extradata.

A new single global PPS is created, and all of the redundant PPSs
within the stream are removed.

@section hevc_metadata

Modify metadata embedded in an HEVC stream.

@table @option
@item aud
Insert or remove AUD NAL units in all access units of the stream.

@table @samp
@item insert
@item remove
@end table

@item sample_aspect_ratio
Set the sample aspect ratio in the stream in the VUI parameters.

@item video_format
@item video_full_range_flag
Set the video format in the stream (see H.265 section E.3.1 and
table E.2).

@item colour_primaries
@item transfer_characteristics
@item matrix_coefficients
Set the colour description in the stream (see H.265 section E.3.1
and tables E.3, E.4 and E.5).

@item chroma_sample_loc_type
Set the chroma sample location in the stream (see H.265 section
E.3.1 and figure E.1).

@item tick_rate
Set the tick rate in the VPS and VUI parameters (num_units_in_tick /
time_scale).  Combined with @option{num_ticks_poc_diff_one}, this can
set a constant framerate in the stream.  Note that it is likely to be
overridden by container parameters when the stream is in a container.

@item num_ticks_poc_diff_one
Set poc_proportional_to_timing_flag in VPS and VUI and use this value
to set num_ticks_poc_diff_one_minus1 (see H.265 sections 7.4.3.1 and
E.3.1).  Ignored if @option{tick_rate} is not also set.

@item crop_left
@item crop_right
@item crop_top
@item crop_bottom
Set the conformance window cropping offsets in the SPS.  These values
will replace the current ones if the stream is already cropped.

These fields are set in pixels.  Note that some sizes may not be
representable if the chroma is subsampled (H.265 section 7.4.3.2.1).

@item level
Set the level in the VPS and SPS.  See H.265 section A.4 and tables
A.6 and A.7.

The argument must be the name of a level (for example, @samp{5.1}), a
@emph{general_level_idc} value (for example, @samp{153} for level 5.1),
or the special name @samp{auto} indicating that the filter should
attempt to guess the level from the input stream properties.

@end table

@section hevc_mp4toannexb

Convert an HEVC/H.265 bitstream from length prefixed mode to start code
prefixed mode (as defined in the Annex B of the ITU-T H.265
specification).

This is required by some streaming formats, typically the MPEG-2
transport stream format (muxer @code{mpegts}).

For example to remux an MP4 file containing an HEVC stream to mpegts
format with @command{ffmpeg}, you can use the command:

@example
ffmpeg -i INPUT.mp4 -codec copy -bsf:v hevc_mp4toannexb OUTPUT.ts
@end example

Please note that this filter is auto-inserted for MPEG-TS (muxer
@code{mpegts}) and raw HEVC/H.265 (muxer @code{h265} or
@code{hevc}) output formats.

@section imxdump

Modifies the bitstream to fit in MOV and to be usable by the Final Cut
Pro decoder. This filter only applies to the mpeg2video codec, and is
likely not needed for Final Cut Pro 7 and newer with the appropriate
@option{-tag:v}.

For example, to remux 30 MB/sec NTSC IMX to MOV:

@example
ffmpeg -i input.mxf -c copy -bsf:v imxdump -tag:v mx3n output.mov
@end example

@section mjpeg2jpeg

Convert MJPEG/AVI1 packets to full JPEG/JFIF packets.

MJPEG is a video codec wherein each video frame is essentially a
JPEG image. The individual frames can be extracted without loss,
e.g. by

@example
ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg
@end example

Unfortunately, these chunks are incomplete JPEG images, because
they lack the DHT segment required for decoding. Quoting from
@url{http://www.digitalpreservation.gov/formats/fdd/fdd000063.shtml}:

Avery Lee, writing in the rec.video.desktop newsgroup in 2001,
commented that "MJPEG, or at least the MJPEG in AVIs having the
MJPG fourcc, is restricted JPEG with a fixed -- and *omitted* --
Huffman table. The JPEG must be YCbCr colorspace, it must be 4:2:2,
and it must use basic Huffman encoding, not arithmetic or
progressive. . . . You can indeed extract the MJPEG frames and
decode them with a regular JPEG decoder, but you have to prepend
the DHT segment to them, or else the decoder won't have any idea
how to decompress the data. The exact table necessary is given in
the OpenDML spec."

This bitstream filter patches the header of frames extracted from an MJPEG
stream (carrying the AVI1 header ID and lacking a DHT segment) to
produce fully qualified JPEG images.

@example
ffmpeg -i mjpeg-movie.avi -c:v copy -bsf:v mjpeg2jpeg frame_%d.jpg
exiftran -i -9 frame*.jpg
ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
@end example

@section mjpegadump

Add an MJPEG A header to the bitstream, to enable decoding by
Quicktime.

@anchor{mov2textsub}
@section mov2textsub

Extract a representable text file from MOV subtitles, stripping the
metadata header from each subtitle packet.

See also the @ref{text2movsub} filter.

@section mp3decomp

Decompress non-standard compressed MP3 audio headers.

@section mpeg2_metadata

Modify metadata embedded in an MPEG-2 stream.

@table @option
@item display_aspect_ratio
Set the display aspect ratio in the stream.

The following fixed values are supported:
@table @option
@item 4/3
@item 16/9
@item 221/100
@end table
Any other value will result in square pixels being signalled instead
(see H.262 section 6.3.3 and table 6-3).

@item frame_rate
Set the frame rate in the stream.  This is constructed from a table
of known values combined with a small multiplier and divisor - if
the supplied value is not exactly representable, the nearest
representable value will be used instead (see H.262 section 6.3.3
and table 6-4).

@item video_format
Set the video format in the stream (see H.262 section 6.3.6 and
table 6-6).

@item colour_primaries
@item transfer_characteristics
@item matrix_coefficients
Set the colour description in the stream (see H.262 section 6.3.6
and tables 6-7, 6-8 and 6-9).

@end table

@section mpeg4_unpack_bframes

Unpack DivX-style packed B-frames.

DivX-style packed B-frames are not valid MPEG-4 and were only a
workaround for the broken Video for Windows subsystem.
They use more space, can cause minor AV sync issues, require more
CPU power to decode (unless the player has some decoded picture queue
to compensate the 2,0,2,0 frame per packet style) and cause
trouble if copied into a standard container like mp4 or mpeg-ps/ts,
because MPEG-4 decoders may not be able to decode them, since they are
not valid MPEG-4.

For example to fix an AVI file containing an MPEG-4 stream with
DivX-style packed B-frames using @command{ffmpeg}, you can use the command:

@example
ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
@end example

@section noise

Damages the contents of packets or simply drops them without damaging the
container. Can be used for fuzzing or testing error resilience/concealment.

Parameters:
@table @option
@item amount
A numeral string, whose value is related to how often output bytes will
be modified. Therefore, values below or equal to 0 are forbidden, and
the lower the more frequent bytes will be modified, with 1 meaning
every byte is modified.
@item dropamount
A numeral string, whose value is related to how often packets will be dropped.
Therefore, values below or equal to 0 are forbidden, and the lower the more
frequent packets will be dropped, with 1 meaning every packet is dropped.
@end table

The following example applies the modification to every byte but does not drop
any packets.
@example
ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv
@end example

@section null
This bitstream filter passes the packets through unchanged.

@section pcm_rechunk

Repacketize PCM audio to a fixed number of samples per packet or a fixed packet
rate per second. This is similar to the @ref{asetnsamples,,asetnsamples audio
filter,ffmpeg-filters} but works on audio packets instead of audio frames.

@table @option
@item nb_out_samples, n
Set the number of samples per each output audio packet. The number is intended
as the number of samples @emph{per each channel}. Default value is 1024.

@item pad, p
If set to 1, the filter will pad the last audio packet with silence, so that it
will contain the same number of samples (or roughly the same number of samples,
see @option{frame_rate}) as the previous ones. Default value is 1.

@item frame_rate, r
This option makes the filter output a fixed number of packets per second instead
of a fixed number of samples per packet. If the audio sample rate is not
divisible by the frame rate then the number of samples will not be constant but
will vary slightly so that each packet will start as close to the frame
boundary as possible. Using this option has precedence over @option{nb_out_samples}.
@end table

You can generate the well known 1602-1601-1602-1601-1602 pattern of 48kHz audio
for NTSC frame rate using the @option{frame_rate} option.
@example
ffmpeg -f lavfi -i sine=r=48000:d=1 -c pcm_s16le -bsf pcm_rechunk=r=30000/1001 -f framecrc -
@end example

@section prores_metadata

Modify color property metadata embedded in prores stream.

@table @option
@item color_primaries
Set the color primaries.
Available values are:

@table @samp
@item auto
Keep the same color primaries property (default).

@item unknown
@item bt709
@item bt470bg
BT601 625

@item smpte170m
BT601 525

@item bt2020
@item smpte431
DCI P3

@item smpte432
P3 D65

@end table

@item transfer_characteristics
Set the color transfer.
Available values are:

@table @samp
@item auto
Keep the same transfer characteristics property (default).

@item unknown
@item bt709
BT 601, BT 709, BT 2020
@item smpte2084
SMPTE ST 2084
@item arib-std-b67
ARIB STD-B67
@end table


@item matrix_coefficients
Set the matrix coefficient.
Available values are:

@table @samp
@item auto
Keep the same colorspace property (default).

@item unknown
@item bt709
@item smpte170m
BT 601

@item bt2020nc
@end table
@end table

Set Rec709 colorspace for each frame of the file
@example
ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709 output.mov
@end example

Set Hybrid Log-Gamma parameters for each frame of the file
@example
ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt2020:color_trc=arib-std-b67:colorspace=bt2020nc output.mov
@end example

@section remove_extra

Remove extradata from packets.

It accepts the following parameter:
@table @option
@item freq
Set which frame types to remove extradata from.

@table @samp
@item k
Remove extradata from non-keyframes only.

@item keyframe
Remove extradata from keyframes only.

@item e, all
Remove extradata from all frames.

@end table
@end table

@section setts
Set PTS and DTS in packets.

It accepts the following parameters:
@table @option
@item ts
@item pts
@item dts
Set expressions for PTS, DTS or both.
@end table

The expressions are evaluated through the eval API and can contain the following
constants:

@table @option
@item N
The count of the input packet. Starting from 0.

@item TS
The demux timestamp in input in case of @code{ts} or @code{dts} option or presentation
timestamp in case of @code{pts} option.

@item POS
The original position in the file of the packet, or undefined if undefined
for the current packet

@item DTS
The demux timestamp in input.

@item PTS
The presentation timestamp in input.

@item STARTDTS
The DTS of the first packet.

@item STARTPTS
The PTS of the first packet.

@item PREV_INDTS
The previous input DTS.

@item PREV_INPTS
The previous input PTS.

@item PREV_OUTDTS
The previous output DTS.

@item PREV_OUTPTS
The previous output PTS.

@item TB
The timebase of stream packet belongs.

@item SR
The sample rate of stream packet belongs.
@end table

@anchor{text2movsub}
@section text2movsub

Convert text subtitles to MOV subtitles (as used by the @code{mov_text}
codec) with metadata headers.

See also the @ref{mov2textsub} filter.

@section trace_headers

Log trace output containing all syntax elements in the coded stream
headers (everything above the level of individual coded blocks).
This can be useful for debugging low-level stream issues.

Supports AV1, H.264, H.265, (M)JPEG, MPEG-2 and VP9, but depending
on the build only a subset of these may be available.

@section truehd_core

Extract the core from a TrueHD stream, dropping ATMOS data.

@section vp9_metadata

Modify metadata embedded in a VP9 stream.

@table @option
@item color_space
Set the color space value in the frame header.  Note that any frame
set to RGB will be implicitly set to PC range and that RGB is
incompatible with profiles 0 and 2.
@table @samp
@item unknown
@item bt601
@item bt709
@item smpte170
@item smpte240
@item bt2020
@item rgb
@end table

@item color_range
Set the color range value in the frame header.  Note that any value
imposed by the color space will take precedence over this value.
@table @samp
@item tv
@item pc
@end table
@end table

@section vp9_superframe

Merge VP9 invisible (alt-ref) frames back into VP9 superframes. This
fixes merging of split/segmented VP9 streams where the alt-ref frame
was split from its visible counterpart.

@section vp9_superframe_split

Split VP9 superframes into single frames.

@section vp9_raw_reorder

Given a VP9 stream with correct timestamps but possibly out of order,
insert additional show-existing-frame packets to correct the ordering.

@c man end BITSTREAM FILTERS
