schema_version: 0.3
type: producer
identifier: avformat
title: FFmpeg Reader
version: 4
copyright: Meltytech, LLC
license: LGPLv2.1
language: en
url: http://www.ffmpeg.org/
tags:
  - Audio
  - Video
description: Read an audio and/or video file using FFmpeg.

notes: >
  This service uses mlt_cache to prevent many simultaneous, open instances
  of libavformat and libavcodec contexts, file handles, and threads in memory
  at the same time. Not only does it save on RAM usage, but kernels enforce
  maximum open file handles and threads per process. Without caching, large
  projects could easily run into these limits. The default producer cache
  size is in mlt_cache at size 4. When using mlt_multitrack, the size is
  adjusted automatically to be the number of tracks plus one if at least 4.
  This makes it rather dynamic and automatic; however, there are some service
  graph configurations or authoring scenarios that do not exclusively use the
  multitrack for multi-layer operations and may need a larger avformat
  producer cache size. One can set the environment variable
  MLT_AVFORMAT_PRODUCER_CACHE to a number to override and increase the size of
  this cache (or to lower it for limited use cases and seeking to minimize RAM).
  One can set the environment variables MLT_AVFORMAT_HWACCEL and
  MLT_AVFORMAT_HWACCEL_DEVICE to affect the usage of hwaccel decoding globally.
  Hardware decoding gracefully falls back to software decoding.

bugs:
  - Audio sync discrepancy with some content.
  - Not all libavformat supported formats are seekable.
  - >
    Seeking is not always accurate. Sometimes it doesn't seek to I-frames so you
    may get junk for a few frames.
  - >
    More than 2 channels of audio more than 16 bits is not supported.

parameters:
  - identifier: resource
    argument: yes
    title: File/URL
    type: string
    description: |
      A file name specification or URL in the form:
      [{protocol}|{format}]:{resource}[?{format-parameter}[&{format-parameter}...]]
      For example, video4linux2:/dev/video1?width=320&height=240
      Note: on the bash command line, '&' must be escaped as '\&'.
      If you need '?' in the resource name it must be escaped as '\?'.
      Use 'f-list' to see a list of supported file formats.
      Use 'vcodec-list' to see a list of supported video decoders.
      Use 'acodec-list' to see a list of supported audio decoders.
    readonly: no
    required: yes
    mutable: no
    widget: fileopen # could provide a button to use a file-open dialog 

  - identifier: audio_index
    title: Audio index
    type: integer
    description: >
      Choose the absolute stream index of audio stream to use (-1 is off).
      When this value is equal to the maximum size of a 32-bit signed integer
      or the string "all" then all audio tracks are coalesced into a bundle of
      channels on one audio track.
    readonly: no
    mutable: no
    minimum: -1
    default: 0
    widget: spinner

  - identifier: astream
    title: Audio Stream
    type: integer
    description: >
      Choose the relative stream index (n-th) of audio to use (-1 is off).
      When this value is equal to the maximum size of a 32-bit signed integer
      or the string "all" then all audio tracks are coalesced into a bundle of
      channels on one audio track.
      This property has a higher priority than audio_index.
    readonly: no
    mutable: no
    minimum: -1
    default: 0
    widget: spinner

  - identifier: video_index
    title: Video index
    type: integer
    description: Choose the absolute index of video stream to use (-1 is off)
    readonly: no
    mutable: no
    minimum: -1
    default: 0
    widget: spinner

  - identifier: vstream
    title: Video Stream
    type: integer
    description: >
      Choose the relative stream index (n-th) of video to use (-1 is off).
      This property has a higher priority than video_index.
    readonly: no
    mutable: no
    minimum: -1
    default: 0
    widget: spinner

  - identifier: threads
    title: Decoding threads
    type: integer
    description: Choose the number of threads to use in the decoder(s)
    readonly: no
    mutable: no
    minimum: 0
    maximum: 4
    default: 1
    widget: spinner
    unit: threads # the unit is a label that appears after the widget

  - identifier: force_aspect_ratio
    title: Sample aspect ratio
    type: float
    description: Optionally override a (mis)detected aspect ratio
    readonly: no
    mutable: yes
    minimum: 0.001 # just a UI suggestion
    maximum: 9.999 # just a suggestion
    # no default property means it should be blank in the UI and not applied unless provided

  - identifier: source_fps
    title: Frame rate
    type: float
    scale: 2 # scale is the number of digits to display after the decimal point
    description: the framerate of the resource
    readonly: yes
    unit: frames/second

  - identifier: seekable
    title: Supports seeking
    type: boolean
    description: if the resource can seek
    readonly: yes

  - identifier: width
    title: Width
    type: integer
    unit: pixels
    readonly: yes

  - identifier: height
    title: Height
    type: integer
    unit: pixels
    readonly: yes

  - identifier: noimagecache
    title: Disable image caching
    type: boolean
    widget: checkbox

  - identifier: cache
    title: Number of images cache
    type: integer
    description: >
      By default, this producer caches images to facilitate YADIF deinterlace,
      which needs previous and next frames. Also, caching helps with frame-
      stepping within a player. The default number of images cached is supplied
      by the MLT framework, which is currently 4, but you can override it
      with this property. You can also disable caching by setting it to 0.
      If you are using parallel processing with YADIF deinterlacing, then
      you might need to increase caching to prevent inadvertent backward seeks.
      One can also set this value globally for all instances of avformat by
      setting the environment variable MLT_AVFORMAT_CACHE.

  - identifier: force_progressive
    title: Force progressive
    description: When provided, this overrides the detection of progressive video.
    type: boolean
    widget: checkbox

  - identifier: force_tff
    title: Force top field first
    description: When provided, this overrides the detected field order of interlaced video.
    type: boolean
    widget: checkbox

  - identifier: force_fps
    title: Force frame rate
    description: When provided, this attempts to override the detected frame rate of the video.
    type: float
    widget: checkbox

  - identifier: force_full_range
    title: Force Full Range Color
    description: When provided, this overrides the detected color range of the video (Y'CbCr only).
    type: boolean

  - identifier: force_colorspace
    title: Force colorspace
    description: When provided, this overrides the detected colorspace of the video (Y'CbCr only).
    type: integer
    values:
      - 240 # SMPTE 240M
      - 601 # ITU-R BT.601
      - 709 # ITU-R BT.709

  - identifier: force_color_trc
    title: Force transfer characteristic
    description: >
      When provided, this overrides the detected gamma transfer of the video.
      See libavcodec AVColorTransferCharacteristic for values.
    type: integer

  - identifier: video_delay
    title: Video delay
    description: >
      Manually adjust A/V synchronization.
      A negative value advances the video instead of delaying it.
    type: float
    default: 0
    unit: seconds
    widget: timecode

  - identifier: reconnect
    title: Automatically reconnect?
    description: >
      Whether to attempt to automatically reconnect to a live source when a
      read failure occurs.
    type: boolean
    widget: checkbox

  - identifier: exit_on_disconnect
    title: Exit upon disconnection?
    description: >
      When this is set, the program will terminate with an error if a live source
      becomes disconnected.
    type: boolean
    widget: checkbox

  - identifier: mute_on_pause (*DEPRECATED*)
    title: Mute on Pause
    description: >
      Mute the audio when the same frame is requested twice in a row.
    type: boolean
    default: 0
    widget: checkbox

  - identifier: seek_threshold
    title: Seek Threshold
    description: >
      Number of frames required to trigger a seek forward rather than continuous read
      when reading forward. This can be useful to optimize some applications which
      rely on accelerated reading of a media file or in cases where lack of I-frames
      cause libavformat to face issues in seeking and where user tries to minimize the
      number of seek calls.
    type: integer
    default: 64
    unit: frames

  - identifier: autorotate
    title: Auto-rotate?
    type: boolean
    description: >
      Whether to automatically compensate image orientation if the file is
      tagged with appropriate metadata and this resource has video/images.
    default: 1

  - identifier: rotate
    title: Rotation Override
    description: >
      While there is automatic rotation for orientation, some files are missing
      the metadata for it. This provides an override. It can only rotate by a
      multiple of 90 degrees.
    type: integer
    unit: degrees

  - identifier: filtergraph
    title: Filtergraph
    type: string
    description: Filtergraph to apply to resource. Uses libavfilter syntax.
