| @@ -79,6 +79,126 @@ The format option may be needed for raw input files. | |||
| @c man end DESCRIPTION | |||
| @chapter Detailed description | |||
| @c man begin DETAILED DESCRIPTION | |||
| The transcoding process in @command{avconv} for each output can be described by | |||
| the following diagram: | |||
| @example | |||
| _______ ______________ _________ ______________ ________ | |||
| | | | | | | | | | | | |||
| | input | demuxer | encoded data | decoder | decoded | encoder | encoded data | muxer | output | | |||
| | file | ---------> | packets | ---------> | frames | ---------> | packets | -------> | file | | |||
| |_______| |______________| |_________| |______________| |________| | |||
| @end example | |||
| @command{avconv} calls the libavformat library (containing demuxers) to read | |||
| input files and get packets containing encoded data from them. When there are | |||
| multiple input files, @command{avconv} tries to keep them synchronized by | |||
| tracking lowest timestamp on any active input stream. | |||
| Encoded packets are then passed to the decoder (unless streamcopy is selected | |||
| for the stream, see further for a description). The decoder produces | |||
| uncompressed frames (raw video/PCM audio/...) which can be processed further by | |||
| filtering (see next section). After filtering the frames are passed to the | |||
| encoder, which encodes them and outputs encoded packets again. Finally those are | |||
| passed to the muxer, which writes the encoded packets to the output file. | |||
| @section Filtering | |||
| Before encoding, @command{avconv} can process raw audio and video frames using | |||
| filters from the libavfilter library. Several chained filters form a filter | |||
| graph. @command{avconv} distinguishes between two types of filtergraphs - | |||
| simple and complex. | |||
| @subsection Simple filtergraphs | |||
| Simple filtergraphs are those that have exactly one input and output, both of | |||
| the same type. In the above diagram they can be represented by simply inserting | |||
| an additional step between decoding and encoding: | |||
| @example | |||
| _________ __________ ______________ | |||
| | | | | | | | |||
| | decoded | simple filtergraph | filtered | encoder | encoded data | | |||
| | frames | -------------------> | frames | ---------> | packets | | |||
| |_________| |__________| |______________| | |||
| @end example | |||
| Simple filtergraphs are configured with the per-stream @option{-filter} option | |||
| (with @option{-vf} and @option{-af} aliases for video and audio respectively). | |||
| A simple filtergraph for video can look for example like this: | |||
| @example | |||
| _______ _____________ _______ _____ ________ | |||
| | | | | | | | | | | | |||
| | input | ---> | deinterlace | ---> | scale | ---> | fps | ---> | output | | |||
| |_______| |_____________| |_______| |_____| |________| | |||
| @end example | |||
| Note that some filters change frame properties but not frame contents. E.g. the | |||
| @code{fps} filter in the example above changes number of frames, but does not | |||
| touch the frame contents. Another example is the @code{setpts} filter, which | |||
| only sets timestamps and otherwise passes the frames unchanged. | |||
| @subsection Complex filtergraphs | |||
| Complex filtergraphs are those which cannot be described as simply a linear | |||
| processing chain applied to one stream. This is the case e.g. when the graph has | |||
| more than one input and/or output, or when output stream type is different from | |||
| input. They can be represented with the following diagram: | |||
| @example | |||
| _________ | |||
| | | | |||
| | input 0 |\ __________ | |||
| |_________| \ | | | |||
| \ _________ /| output 0 | | |||
| \ | | / |__________| | |||
| _________ \| complex | / | |||
| | | | |/ | |||
| | input 1 |---->| filter |\ | |||
| |_________| | | \ __________ | |||
| /| graph | \ | | | |||
| / | | \| output 1 | | |||
| _________ / |_________| |__________| | |||
| | | / | |||
| | input 2 |/ | |||
| |_________| | |||
| @end example | |||
| Complex filtergraphs are configured with the @option{-filter_complex} option. | |||
| Note that this option is global, since a complex filtergraph by its nature | |||
| cannot be unambiguously associated with a single stream or file. | |||
| A trivial example of a complex filtergraph is the @code{overlay} filter, which | |||
| has two video inputs and one video output, containing one video overlaid on top | |||
| of the other. Its audio counterpart is the @code{amix} filter. | |||
| @section Stream copy | |||
| Stream copy is a mode selected by supplying the @code{copy} parameter to the | |||
| @option{-codec} option. It makes @command{avconv} omit the decoding and encoding | |||
| step for the specified stream, so it does only demuxing and muxing. It is useful | |||
| for changing the container format or modifying container-level metadata. The | |||
| diagram above will in this case simplify to this: | |||
| @example | |||
| _______ ______________ ________ | |||
| | | | | | | | |||
| | input | demuxer | encoded data | muxer | output | | |||
| | file | ---------> | packets | -------> | file | | |||
| |_______| |______________| |________| | |||
| @end example | |||
| Since there is no decoding or encoding, it is very fast and there is no quality | |||
| loss. However it might not work in some cases because of many factors. Applying | |||
| filters is obviously also impossible, since filters work on uncompressed data. | |||
| @c man end DETAILED DESCRIPTION | |||
| @chapter Stream selection | |||
| @c man begin STREAM SELECTION | |||