| 1 | @chapter Bitstream Filters |
| 2 | @c man begin BITSTREAM FILTERS |
| 3 | |
| 4 | When you configure your FFmpeg build, all the supported bitstream |
| 5 | filters are enabled by default. You can list all available ones using |
| 6 | the configure option @code{--list-bsfs}. |
| 7 | |
| 8 | You can disable all the bitstream filters using the configure option |
| 9 | @code{--disable-bsfs}, and selectively enable any bitstream filter using |
| 10 | the option @code{--enable-bsf=BSF}, or you can disable a particular |
| 11 | bitstream filter using the option @code{--disable-bsf=BSF}. |
| 12 | |
| 13 | The option @code{-bsfs} of the ff* tools will display the list of |
| 14 | all the supported bitstream filters included in your build. |
| 15 | |
| 16 | The ff* tools have a -bsf option applied per stream, taking a |
| 17 | comma-separated list of filters, whose parameters follow the filter |
| 18 | name after a '='. |
| 19 | |
| 20 | @example |
| 21 | ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1/opt2=str2][,filter2] OUTPUT |
| 22 | @end example |
| 23 | |
| 24 | Below is a description of the currently available bitstream filters, |
| 25 | with their parameters, if any. |
| 26 | |
| 27 | @section aac_adtstoasc |
| 28 | |
| 29 | Convert MPEG-2/4 AAC ADTS to MPEG-4 Audio Specific Configuration |
| 30 | bitstream filter. |
| 31 | |
| 32 | This filter creates an MPEG-4 AudioSpecificConfig from an MPEG-2/4 |
| 33 | ADTS header and removes the ADTS header. |
| 34 | |
| 35 | This is required for example when copying an AAC stream from a raw |
| 36 | ADTS AAC container to a FLV or a MOV/MP4 file. |
| 37 | |
| 38 | @section chomp |
| 39 | |
| 40 | Remove zero padding at the end of a packet. |
| 41 | |
| 42 | @section dump_extra |
| 43 | |
| 44 | Add extradata to the beginning of the filtered packets. |
| 45 | |
| 46 | The additional argument specifies which packets should be filtered. |
| 47 | It accepts the values: |
| 48 | @table @samp |
| 49 | @item a |
| 50 | add extradata to all key packets, but only if @var{local_header} is |
| 51 | set in the @option{flags2} codec context field |
| 52 | |
| 53 | @item k |
| 54 | add extradata to all key packets |
| 55 | |
| 56 | @item e |
| 57 | add extradata to all packets |
| 58 | @end table |
| 59 | |
| 60 | If not specified it is assumed @samp{k}. |
| 61 | |
| 62 | For example the following @command{ffmpeg} command forces a global |
| 63 | header (thus disabling individual packet headers) in the H.264 packets |
| 64 | generated by the @code{libx264} encoder, but corrects them by adding |
| 65 | the header stored in extradata to the key packets: |
| 66 | @example |
| 67 | ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts |
| 68 | @end example |
| 69 | |
| 70 | @section h264_mp4toannexb |
| 71 | |
| 72 | Convert an H.264 bitstream from length prefixed mode to start code |
| 73 | prefixed mode (as defined in the Annex B of the ITU-T H.264 |
| 74 | specification). |
| 75 | |
| 76 | This is required by some streaming formats, typically the MPEG-2 |
| 77 | transport stream format ("mpegts"). |
| 78 | |
| 79 | For example to remux an MP4 file containing an H.264 stream to mpegts |
| 80 | format with @command{ffmpeg}, you can use the command: |
| 81 | |
| 82 | @example |
| 83 | ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts |
| 84 | @end example |
| 85 | |
| 86 | @section imxdump |
| 87 | |
| 88 | Modifies the bitstream to fit in MOV and to be usable by the Final Cut |
| 89 | Pro decoder. This filter only applies to the mpeg2video codec, and is |
| 90 | likely not needed for Final Cut Pro 7 and newer with the appropriate |
| 91 | @option{-tag:v}. |
| 92 | |
| 93 | For example, to remux 30 MB/sec NTSC IMX to MOV: |
| 94 | |
| 95 | @example |
| 96 | ffmpeg -i input.mxf -c copy -bsf:v imxdump -tag:v mx3n output.mov |
| 97 | @end example |
| 98 | |
| 99 | @section mjpeg2jpeg |
| 100 | |
| 101 | Convert MJPEG/AVI1 packets to full JPEG/JFIF packets. |
| 102 | |
| 103 | MJPEG is a video codec wherein each video frame is essentially a |
| 104 | JPEG image. The individual frames can be extracted without loss, |
| 105 | e.g. by |
| 106 | |
| 107 | @example |
| 108 | ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg |
| 109 | @end example |
| 110 | |
| 111 | Unfortunately, these chunks are incomplete JPEG images, because |
| 112 | they lack the DHT segment required for decoding. Quoting from |
| 113 | @url{http://www.digitalpreservation.gov/formats/fdd/fdd000063.shtml}: |
| 114 | |
| 115 | Avery Lee, writing in the rec.video.desktop newsgroup in 2001, |
| 116 | commented that "MJPEG, or at least the MJPEG in AVIs having the |
| 117 | MJPG fourcc, is restricted JPEG with a fixed -- and *omitted* -- |
| 118 | Huffman table. The JPEG must be YCbCr colorspace, it must be 4:2:2, |
| 119 | and it must use basic Huffman encoding, not arithmetic or |
| 120 | progressive. . . . You can indeed extract the MJPEG frames and |
| 121 | decode them with a regular JPEG decoder, but you have to prepend |
| 122 | the DHT segment to them, or else the decoder won't have any idea |
| 123 | how to decompress the data. The exact table necessary is given in |
| 124 | the OpenDML spec." |
| 125 | |
| 126 | This bitstream filter patches the header of frames extracted from an MJPEG |
| 127 | stream (carrying the AVI1 header ID and lacking a DHT segment) to |
| 128 | produce fully qualified JPEG images. |
| 129 | |
| 130 | @example |
| 131 | ffmpeg -i mjpeg-movie.avi -c:v copy -bsf:v mjpeg2jpeg frame_%d.jpg |
| 132 | exiftran -i -9 frame*.jpg |
| 133 | ffmpeg -i frame_%d.jpg -c:v copy rotated.avi |
| 134 | @end example |
| 135 | |
| 136 | @section mjpega_dump_header |
| 137 | |
| 138 | @section movsub |
| 139 | |
| 140 | @section mp3_header_decompress |
| 141 | |
| 142 | @section noise |
| 143 | |
| 144 | Damages the contents of packets without damaging the container. Can be |
| 145 | used for fuzzing or testing error resilience/concealment. |
| 146 | |
| 147 | Parameters: |
| 148 | A numeral string, whose value is related to how often output bytes will |
| 149 | be modified. Therefore, values below or equal to 0 are forbidden, and |
| 150 | the lower the more frequent bytes will be modified, with 1 meaning |
| 151 | every byte is modified. |
| 152 | |
| 153 | @example |
| 154 | ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv |
| 155 | @end example |
| 156 | applies the modification to every byte. |
| 157 | |
| 158 | @section remove_extra |
| 159 | |
| 160 | @c man end BITSTREAM FILTERS |