mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2025-03-03 14:14:49 +01:00
bunch of things
This commit is contained in:
parent
cc527b55a6
commit
8aa87fa04f
77 changed files with 361 additions and 251445 deletions
|
@ -684,48 +684,7 @@
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"values.json","CopyToMask":-1,"filePath":"datafiles/data/themes/default",},
|
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"values.json","CopyToMask":-1,"filePath":"datafiles/data/themes/default",},
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"tooltip.zip","CopyToMask":3035426170322551022,"filePath":"datafiles/data",},
|
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"tooltip.zip","CopyToMask":3035426170322551022,"filePath":"datafiles/data",},
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg.exe","CopyToMask":-1,"filePath":"datafiles/ffmpeg/bin",},
|
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg.exe","CopyToMask":-1,"filePath":"datafiles/ffmpeg/bin",},
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffplay.exe","CopyToMask":-1,"filePath":"datafiles/ffmpeg/bin",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffprobe.exe","CopyToMask":-1,"filePath":"datafiles/ffmpeg/bin",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"bootstrap.min.css","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"community.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"default.css","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"developer.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"faq.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"fate.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-all.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-bitstream-filters.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-codecs.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-devices.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-filters.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-formats.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-protocols.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-resampler.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-scaler.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg-utils.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffmpeg.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffplay-all.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffplay.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffprobe-all.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"ffprobe.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"general.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"git-howto.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libavcodec.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libavdevice.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libavfilter.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libavformat.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libavutil.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libswresample.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libswscale.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"mailing-list-faq.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"nut.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"platform.html","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"style.min.css","CopyToMask":-1,"filePath":"datafiles/ffmpeg/doc",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"LICENSE","CopyToMask":-1,"filePath":"datafiles/ffmpeg",},
|
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"LICENSE","CopyToMask":-1,"filePath":"datafiles/ffmpeg",},
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libvpx-1080p.ffpreset","CopyToMask":-1,"filePath":"datafiles/ffmpeg/presets",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libvpx-1080p50_60.ffpreset","CopyToMask":-1,"filePath":"datafiles/ffmpeg/presets",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libvpx-360p.ffpreset","CopyToMask":-1,"filePath":"datafiles/ffmpeg/presets",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libvpx-720p.ffpreset","CopyToMask":-1,"filePath":"datafiles/ffmpeg/presets",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"libvpx-720p50_60.ffpreset","CopyToMask":-1,"filePath":"datafiles/ffmpeg/presets",},
|
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"README.txt","CopyToMask":-1,"filePath":"datafiles/ffmpeg",},
|
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"README.txt","CopyToMask":-1,"filePath":"datafiles/ffmpeg",},
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"0 introduction.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
|
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"0 introduction.png","CopyToMask":-1,"filePath":"datafiles/Getting started",},
|
||||||
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"0 introduction.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",},
|
{"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"0 introduction.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",},
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
5
datafiles/ffmpeg/doc/bootstrap.min.css
vendored
5
datafiles/ffmpeg/doc/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
|
@ -1,250 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Community</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Community">
|
|
||||||
<meta name="keywords" content="Community">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<a class="anchor" id="Organisation"></a><div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Organisation-1" href="#Organisation-1">1 Organisation</a></li>
|
|
||||||
<li><a id="toc-General-Assembly-1" href="#General-Assembly-1">2 General Assembly</a></li>
|
|
||||||
<li><a id="toc-Voting-1" href="#Voting-1">3 Voting</a></li>
|
|
||||||
<li><a id="toc-Technical-Committee-1" href="#Technical-Committee-1">4 Technical Committee</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Resolution-Process-1" href="#Resolution-Process-1">4.1 Resolution Process</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Seizing" href="#Seizing">4.1.1 Seizing</a></li>
|
|
||||||
<li><a id="toc-Announcement" href="#Announcement">4.1.2 Announcement</a></li>
|
|
||||||
<li><a id="toc-RFC-call" href="#RFC-call">4.1.3 RFC call</a></li>
|
|
||||||
<li><a id="toc-Within-TC" href="#Within-TC">4.1.4 Within TC</a></li>
|
|
||||||
<li><a id="toc-Decisions" href="#Decisions">4.1.5 Decisions</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Community-Committee-1" href="#Community-Committee-1">5 Community Committee</a></li>
|
|
||||||
<li><a id="toc-Code-of-Conduct-1" href="#Code-of-Conduct-1">6 Code of Conduct</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Organisation-1">
|
|
||||||
<h2 class="chapter">1 Organisation</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg project is organized through a community working on global consensus.
|
|
||||||
</p>
|
|
||||||
<p>Decisions are taken by the ensemble of active members, through voting and are aided by two committees.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="General-Assembly"></a></div>
|
|
||||||
<div class="chapter-level-extent" id="General-Assembly-1">
|
|
||||||
<h2 class="chapter">2 General Assembly</h2>
|
|
||||||
|
|
||||||
<p>The ensemble of active members is called the General Assembly (GA).
|
|
||||||
</p>
|
|
||||||
<p>The General Assembly is sovereign and legitimate for all its decisions regarding the FFmpeg project.
|
|
||||||
</p>
|
|
||||||
<p>The General Assembly is made up of active contributors.
|
|
||||||
</p>
|
|
||||||
<p>Contributors are considered "active contributors" if they have pushed more than 20 patches in the last 36 months in the main FFmpeg repository, or if they have been voted in by the GA.
|
|
||||||
</p>
|
|
||||||
<p>Additional members are added to the General Assembly through a vote after proposal by a member of the General Assembly. They are part of the GA for two years, after which they need a confirmation by the GA.
|
|
||||||
</p>
|
|
||||||
<p>A script to generate the current members of the general assembly (minus members voted in) can be found in ‘tools/general_assembly.pl‘.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="Voting"></a></div>
|
|
||||||
<div class="chapter-level-extent" id="Voting-1">
|
|
||||||
<h2 class="chapter">3 Voting</h2>
|
|
||||||
|
|
||||||
<p>Voting is done using a ranked voting system, currently running on https://vote.ffmpeg.org/ .
|
|
||||||
</p>
|
|
||||||
<p>Majority vote means more than 50% of the expressed ballots.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="Technical-Committee"></a></div>
|
|
||||||
<div class="chapter-level-extent" id="Technical-Committee-1">
|
|
||||||
<h2 class="chapter">4 Technical Committee</h2>
|
|
||||||
|
|
||||||
<p>The Technical Committee (TC) is here to arbitrate and make decisions when technical conflicts occur in the project. They will consider the merits of all the positions, judge them and make a decision.
|
|
||||||
</p>
|
|
||||||
<p>The TC resolves technical conflicts but is not a technical steering committee.
|
|
||||||
</p>
|
|
||||||
<p>Decisions by the TC are binding for all the contributors.
|
|
||||||
</p>
|
|
||||||
<p>Decisions made by the TC can be re-opened after 1 year or by a majority vote of the General Assembly, requested by one of the member of the GA.
|
|
||||||
</p>
|
|
||||||
<p>The TC is elected by the General Assembly for a duration of 1 year, and is composed of 5 members. Members can be re-elected if they wish. A majority vote in the General Assembly can trigger a new election of the TC.
|
|
||||||
</p>
|
|
||||||
<p>The members of the TC can be elected from outside of the GA. Candidates for election can either be suggested or self-nominated.
|
|
||||||
</p>
|
|
||||||
<p>The conflict resolution process is detailed in the resolution process document.
|
|
||||||
</p>
|
|
||||||
<p>The TC can be contacted at <tc@ffmpeg>.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="Resolution-Process"></a><ul class="mini-toc">
|
|
||||||
<li><a href="#Resolution-Process-1" accesskey="1">Resolution Process</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Resolution-Process-1">
|
|
||||||
<h3 class="section">4.1 Resolution Process</h3>
|
|
||||||
|
|
||||||
<p>The Technical Committee (TC) is here to arbitrate and make decisions when technical conflicts occur in the project.
|
|
||||||
</p>
|
|
||||||
<p>The TC main role is to resolve technical conflicts. It is therefore not a technical steering committee, but it is understood that some decisions might impact the future of the project.
|
|
||||||
</p>
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Seizing" accesskey="1">Seizing</a></li>
|
|
||||||
<li><a href="#Announcement" accesskey="2">Announcement</a></li>
|
|
||||||
<li><a href="#RFC-call" accesskey="3">RFC call</a></li>
|
|
||||||
<li><a href="#Within-TC" accesskey="4">Within TC</a></li>
|
|
||||||
<li><a href="#Decisions" accesskey="5">Decisions</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="subsection-level-extent" id="Seizing">
|
|
||||||
<h4 class="subsection">4.1.1 Seizing</h4>
|
|
||||||
|
|
||||||
<p>The TC can take possession of any technical matter that it sees fit.
|
|
||||||
</p>
|
|
||||||
<p>To involve the TC in a matter, email tc or CC them on an ongoing discussion.
|
|
||||||
</p>
|
|
||||||
<p>As members of TC are developers, they also can email tc to raise an issue.
|
|
||||||
</p></div>
|
|
||||||
<div class="subsection-level-extent" id="Announcement">
|
|
||||||
<h4 class="subsection">4.1.2 Announcement</h4>
|
|
||||||
|
|
||||||
<p>The TC, once seized, must announce itself on the main mailing list, with a [TC] tag.
|
|
||||||
</p>
|
|
||||||
<p>The TC has 2 modes of operation: a RFC one and an internal one.
|
|
||||||
</p>
|
|
||||||
<p>If the TC thinks it needs the input from the larger community, the TC can call for a RFC. Else, it can decide by itself.
|
|
||||||
</p>
|
|
||||||
<p>If the disagreement involves a member of the TC, that member should recuse themselves from the decision.
|
|
||||||
</p>
|
|
||||||
<p>The decision to use a RFC process or an internal discussion is a discretionary decision of the TC.
|
|
||||||
</p>
|
|
||||||
<p>The TC can also reject a seizure for a few reasons such as: the matter was not discussed enough previously; it lacks expertise to reach a beneficial decision on the matter; or the matter is too trivial.
|
|
||||||
</p></div>
|
|
||||||
<div class="subsection-level-extent" id="RFC-call">
|
|
||||||
<h4 class="subsection">4.1.3 RFC call</h4>
|
|
||||||
|
|
||||||
<p>In the RFC mode, one person from the TC posts on the mailing list the technical question and will request input from the community.
|
|
||||||
</p>
|
|
||||||
<p>The mail will have the following specification:
|
|
||||||
</p>
|
|
||||||
<p>a precise title
|
|
||||||
a specific tag [TC RFC]
|
|
||||||
a top-level email
|
|
||||||
contain a precise question that does not exceed 100 words and that is answerable by developers
|
|
||||||
may have an extra description, or a link to a previous discussion, if deemed necessary,
|
|
||||||
contain a precise end date for the answers.
|
|
||||||
</p>
|
|
||||||
<p>The answers from the community must be on the main mailing list and must have the following specification:
|
|
||||||
</p>
|
|
||||||
<p>keep the tag and the title unchanged
|
|
||||||
limited to 400 words
|
|
||||||
a first-level, answering directly to the main email
|
|
||||||
answering to the question.
|
|
||||||
</p>
|
|
||||||
<p>Further replies to answers are permitted, as long as they conform to the community standards of politeness, they are limited to 100 words, and are not nested more than once. (max-depth=2)
|
|
||||||
</p>
|
|
||||||
<p>After the end-date, mails on the thread will be ignored.
|
|
||||||
</p>
|
|
||||||
<p>Violations of those rules will be escalated through the Community Committee.
|
|
||||||
</p>
|
|
||||||
<p>After all the emails are in, the TC has 96 hours to give its final decision. Exceptionally, the TC can request an extra delay, that will be notified on the mailing list.
|
|
||||||
</p></div>
|
|
||||||
<div class="subsection-level-extent" id="Within-TC">
|
|
||||||
<h4 class="subsection">4.1.4 Within TC</h4>
|
|
||||||
|
|
||||||
<p>In the internal case, the TC has 96 hours to give its final decision. Exceptionally, the TC can request an extra delay.
|
|
||||||
</p></div>
|
|
||||||
<div class="subsection-level-extent" id="Decisions">
|
|
||||||
<h4 class="subsection">4.1.5 Decisions</h4>
|
|
||||||
|
|
||||||
<p>The decisions from the TC will be sent on the mailing list, with the [TC] tag.
|
|
||||||
</p>
|
|
||||||
<p>Internally, the TC should take decisions with a majority, or using ranked-choice voting.
|
|
||||||
</p>
|
|
||||||
<p>The decision from the TC should be published with a summary of the reasons that lead to this decision.
|
|
||||||
</p>
|
|
||||||
<p>The decisions from the TC are final, until the matters are reopened after no less than one year.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="Community-Committee"></a></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Community-Committee-1">
|
|
||||||
<h2 class="chapter">5 Community Committee</h2>
|
|
||||||
|
|
||||||
<p>The Community Committee (CC) is here to arbitrage and make decisions when inter-personal conflicts occur in the project. It will decide quickly and take actions, for the sake of the project.
|
|
||||||
</p>
|
|
||||||
<p>The CC can remove privileges of offending members, including removal of commit access and temporary ban from the community.
|
|
||||||
</p>
|
|
||||||
<p>Decisions made by the CC can be re-opened after 1 year or by a majority vote of the General Assembly. Indefinite bans from the community must be confirmed by the General Assembly, in a majority vote.
|
|
||||||
</p>
|
|
||||||
<p>The CC is elected by the General Assembly for a duration of 1 year, and is composed of 5 members. Members can be re-elected if they wish. A majority vote in the General Assembly can trigger a new election of the CC.
|
|
||||||
</p>
|
|
||||||
<p>The members of the CC can be elected from outside of the GA. Candidates for election can either be suggested or self-nominated.
|
|
||||||
</p>
|
|
||||||
<p>The CC is governed by and responsible for enforcing the Code of Conduct.
|
|
||||||
</p>
|
|
||||||
<p>The CC can be contacted at <cc@ffmpeg>.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="Code-of-Conduct"></a></div>
|
|
||||||
<div class="chapter-level-extent" id="Code-of-Conduct-1">
|
|
||||||
<h2 class="chapter">6 Code of Conduct</h2>
|
|
||||||
|
|
||||||
<p>Be friendly and respectful towards others and third parties.
|
|
||||||
Treat others the way you yourself want to be treated.
|
|
||||||
</p>
|
|
||||||
<p>Be considerate. Not everyone shares the same viewpoint and priorities as you do.
|
|
||||||
Different opinions and interpretations help the project.
|
|
||||||
Looking at issues from a different perspective assists development.
|
|
||||||
</p>
|
|
||||||
<p>Do not assume malice for things that can be attributed to incompetence. Even if
|
|
||||||
it is malice, it’s rarely good to start with that as initial assumption.
|
|
||||||
</p>
|
|
||||||
<p>Stay friendly even if someone acts contrarily. Everyone has a bad day
|
|
||||||
once in a while.
|
|
||||||
If you yourself have a bad day or are angry then try to take a break and reply
|
|
||||||
once you are calm and without anger if you have to.
|
|
||||||
</p>
|
|
||||||
<p>Try to help other team members and cooperate if you can.
|
|
||||||
</p>
|
|
||||||
<p>The goal of software development is to create technical excellence, not for any
|
|
||||||
individual to be better and "win" against the others. Large software projects
|
|
||||||
are only possible and successful through teamwork.
|
|
||||||
</p>
|
|
||||||
<p>If someone struggles do not put them down. Give them a helping hand
|
|
||||||
instead and point them in the right direction.
|
|
||||||
</p>
|
|
||||||
<p>Finally, keep in mind the immortal words of Bill and Ted,
|
|
||||||
"Be excellent to each other."
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,165 +0,0 @@
|
||||||
a.summary-letter {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: #2D6198;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:visited {
|
|
||||||
color: #884488;
|
|
||||||
}
|
|
||||||
|
|
||||||
#banner {
|
|
||||||
background-color: white;
|
|
||||||
position: relative;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#banner img {
|
|
||||||
margin-bottom: 1px;
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#body {
|
|
||||||
margin-left: 1em;
|
|
||||||
margin-right: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: #313131;
|
|
||||||
margin: 0;
|
|
||||||
text-align: justify;
|
|
||||||
}
|
|
||||||
|
|
||||||
.center {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#container {
|
|
||||||
background-color: white;
|
|
||||||
color: #202020;
|
|
||||||
margin-left: 1em;
|
|
||||||
margin-right: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#footer {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 a, h2 a, h3 a, h4 a {
|
|
||||||
text-decoration: inherit;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3, h4 {
|
|
||||||
padding-left: 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
padding-bottom: 0.25em;
|
|
||||||
padding-top: 0.25em;
|
|
||||||
border: 1px solid #6A996A;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
background-color: #7BB37B;
|
|
||||||
color: #151515;
|
|
||||||
font-size: 1.2em;
|
|
||||||
padding-bottom: 0.3em;
|
|
||||||
padding-top: 0.3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
color: #313131;
|
|
||||||
font-size: 1.0em;
|
|
||||||
background-color: #ABE3AB;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
color: #313131;
|
|
||||||
font-size: 0.9em;
|
|
||||||
margin-bottom: -6px;
|
|
||||||
background-color: #BBF3BB;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
color: #313131;
|
|
||||||
font-size: 0.8em;
|
|
||||||
margin-bottom: -8px;
|
|
||||||
background-color: #D1FDD1;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#navbar {
|
|
||||||
background-color: #738073;
|
|
||||||
border-bottom: 1px solid #5C665C;
|
|
||||||
border-top: 1px solid #5C665C;
|
|
||||||
margin-top: 12px;
|
|
||||||
padding: 0.3em;
|
|
||||||
position: relative;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#navbar a, #navbar_secondary a {
|
|
||||||
color: white;
|
|
||||||
padding: 0.3em;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#navbar a:hover, #navbar_secondary a:hover {
|
|
||||||
background-color: #313131;
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#navbar_secondary {
|
|
||||||
background-color: #738073;
|
|
||||||
border-bottom: 1px solid #5C665C;
|
|
||||||
border-left: 1px solid #5C665C;
|
|
||||||
border-right: 1px solid #5C665C;
|
|
||||||
padding: 0.3em;
|
|
||||||
position: relative;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-left: 1em;
|
|
||||||
margin-right: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
margin-left: 3em;
|
|
||||||
margin-right: 3em;
|
|
||||||
padding: 0.3em;
|
|
||||||
border: 1px solid #bbb;
|
|
||||||
background-color: #f7f7f7;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl dt {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
#proj_desc {
|
|
||||||
font-size: 1.2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#repos {
|
|
||||||
margin-left: 1em;
|
|
||||||
margin-right: 1em;
|
|
||||||
border-collapse: collapse;
|
|
||||||
border: solid 1px #6A996A;
|
|
||||||
}
|
|
||||||
|
|
||||||
#repos th {
|
|
||||||
background-color: #7BB37B;
|
|
||||||
border: solid 1px #6A996A;
|
|
||||||
}
|
|
||||||
|
|
||||||
#repos td {
|
|
||||||
padding: 0.2em;
|
|
||||||
border: solid 1px #6A996A;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,941 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>FFmpeg FAQ</title>
|
|
||||||
|
|
||||||
<meta name="description" content="FFmpeg FAQ">
|
|
||||||
<meta name="keywords" content="FFmpeg FAQ">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
div.example {margin-left: 3.2em}
|
|
||||||
ul.mark-bullet {list-style-type: disc}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-General-Questions" href="#General-Questions">1 General Questions</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Why-doesn_0027t-FFmpeg-support-feature-_005bxyz_005d_003f" href="#Why-doesn_0027t-FFmpeg-support-feature-_005bxyz_005d_003f">1.1 Why doesn’t FFmpeg support feature [xyz]?</a></li>
|
|
||||||
<li><a id="toc-FFmpeg-does-not-support-codec-XXX_002e-Can-you-include-a-Windows-DLL-loader-to-support-it_003f" href="#FFmpeg-does-not-support-codec-XXX_002e-Can-you-include-a-Windows-DLL-loader-to-support-it_003f">1.2 FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?</a></li>
|
|
||||||
<li><a id="toc-I-cannot-read-this-file-although-this-format-seems-to-be-supported-by-ffmpeg_002e" href="#I-cannot-read-this-file-although-this-format-seems-to-be-supported-by-ffmpeg_002e">1.3 I cannot read this file although this format seems to be supported by ffmpeg.</a></li>
|
|
||||||
<li><a id="toc-Which-codecs-are-supported-by-Windows_003f" href="#Which-codecs-are-supported-by-Windows_003f">1.4 Which codecs are supported by Windows?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Compilation" href="#Compilation">2 Compilation</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-error_003a-can_0027t-find-a-register-in-class-_0027GENERAL_005fREGS_0027-while-reloading-_0027asm_0027" href="#error_003a-can_0027t-find-a-register-in-class-_0027GENERAL_005fREGS_0027-while-reloading-_0027asm_0027">2.1 <code class="code">error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'</code></a></li>
|
|
||||||
<li><a id="toc-I-have-installed-this-library-with-my-distro_0027s-package-manager_002e-Why-does-configure-not-see-it_003f" href="#I-have-installed-this-library-with-my-distro_0027s-package-manager_002e-Why-does-configure-not-see-it_003f">2.2 I have installed this library with my distro’s package manager. Why does <code class="command">configure</code> not see it?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-make-pkg_002dconfig-find-my-libraries_003f" href="#How-do-I-make-pkg_002dconfig-find-my-libraries_003f">2.3 How do I make <code class="command">pkg-config</code> find my libraries?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-use-pkg_002dconfig-when-cross_002dcompiling_003f" href="#How-do-I-use-pkg_002dconfig-when-cross_002dcompiling_003f">2.4 How do I use <code class="command">pkg-config</code> when cross-compiling?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Usage" href="#Usage">3 Usage</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-ffmpeg-does-not-work_003b-what-is-wrong_003f" href="#ffmpeg-does-not-work_003b-what-is-wrong_003f">3.1 ffmpeg does not work; what is wrong?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-encode-single-pictures-into-movies_003f" href="#How-do-I-encode-single-pictures-into-movies_003f">3.2 How do I encode single pictures into movies?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-encode-movie-to-single-pictures_003f" href="#How-do-I-encode-movie-to-single-pictures_003f">3.3 How do I encode movie to single pictures?</a></li>
|
|
||||||
<li><a id="toc-Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f" href="#Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f">3.4 Why do I see a slight quality degradation with multithreaded MPEG* encoding?</a></li>
|
|
||||||
<li><a id="toc-How-can-I-read-from-the-standard-input-or-write-to-the-standard-output_003f" href="#How-can-I-read-from-the-standard-input-or-write-to-the-standard-output_003f">3.5 How can I read from the standard input or write to the standard output?</a></li>
|
|
||||||
<li><a id="toc-_002df-jpeg-doesn_0027t-work_002e" href="#g_t_002df-jpeg-doesn_0027t-work_002e">3.6 -f jpeg doesn’t work.</a></li>
|
|
||||||
<li><a id="toc-Why-can-I-not-change-the-frame-rate_003f" href="#Why-can-I-not-change-the-frame-rate_003f">3.7 Why can I not change the frame rate?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-encode-Xvid-or-DivX-video-with-ffmpeg_003f" href="#How-do-I-encode-Xvid-or-DivX-video-with-ffmpeg_003f">3.8 How do I encode Xvid or DivX video with ffmpeg?</a></li>
|
|
||||||
<li><a id="toc-Which-are-good-parameters-for-encoding-high-quality-MPEG_002d4_003f" href="#Which-are-good-parameters-for-encoding-high-quality-MPEG_002d4_003f">3.9 Which are good parameters for encoding high quality MPEG-4?</a></li>
|
|
||||||
<li><a id="toc-Which-are-good-parameters-for-encoding-high-quality-MPEG_002d1_002fMPEG_002d2_003f" href="#Which-are-good-parameters-for-encoding-high-quality-MPEG_002d1_002fMPEG_002d2_003f">3.10 Which are good parameters for encoding high quality MPEG-1/MPEG-2?</a></li>
|
|
||||||
<li><a id="toc-Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f" href="#Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f">3.11 Interlaced video looks very bad when encoded with ffmpeg, what is wrong?</a></li>
|
|
||||||
<li><a id="toc-How-can-I-read-DirectShow-files_003f" href="#How-can-I-read-DirectShow-files_003f">3.12 How can I read DirectShow files?</a></li>
|
|
||||||
<li><a id="toc-How-can-I-join-video-files_003f" href="#How-can-I-join-video-files_003f">3.13 How can I join video files?</a></li>
|
|
||||||
<li><a id="toc-How-can-I-concatenate-video-files_003f" href="#How-can-I-concatenate-video-files_003f">3.14 How can I concatenate video files?</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Concatenating-using-the-concat-filter" href="#Concatenating-using-the-concat-filter">3.14.1 Concatenating using the concat <em class="emph">filter</em></a></li>
|
|
||||||
<li><a id="toc-Concatenating-using-the-concat-demuxer" href="#Concatenating-using-the-concat-demuxer">3.14.2 Concatenating using the concat <em class="emph">demuxer</em></a></li>
|
|
||||||
<li><a id="toc-Concatenating-using-the-concat-protocol-_0028file-level_0029" href="#Concatenating-using-the-concat-protocol-_0028file-level_0029">3.14.3 Concatenating using the concat <em class="emph">protocol</em> (file level)</a></li>
|
|
||||||
<li><a id="toc-Concatenating-using-raw-audio-and-video" href="#Concatenating-using-raw-audio-and-video">3.14.4 Concatenating using raw audio and video</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Using-_002df-lavfi_002c-audio-becomes-mono-for-no-apparent-reason_002e" href="#Using-_002df-lavfi_002c-audio-becomes-mono-for-no-apparent-reason_002e">3.15 Using <samp class="option">-f lavfi</samp>, audio becomes mono for no apparent reason.</a></li>
|
|
||||||
<li><a id="toc-Why-does-FFmpeg-not-see-the-subtitles-in-my-VOB-file_003f" href="#Why-does-FFmpeg-not-see-the-subtitles-in-my-VOB-file_003f">3.16 Why does FFmpeg not see the subtitles in my VOB file?</a></li>
|
|
||||||
<li><a id="toc-Why-was-the-ffmpeg-_002dsameq-option-removed_003f-What-to-use-instead_003f" href="#Why-was-the-ffmpeg-_002dsameq-option-removed_003f-What-to-use-instead_003f">3.17 Why was the <code class="command">ffmpeg</code> <samp class="option">-sameq</samp> option removed? What to use instead?</a></li>
|
|
||||||
<li><a id="toc-I-have-a-stretched-video_002c-why-does-scaling-does-not-fix-it_003f" href="#I-have-a-stretched-video_002c-why-does-scaling-does-not-fix-it_003f">3.18 I have a stretched video, why does scaling does not fix it?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-run-ffmpeg-as-a-background-task_003f" href="#How-do-I-run-ffmpeg-as-a-background-task_003f">3.19 How do I run ffmpeg as a background task?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-prevent-ffmpeg-from-suspending-with-a-message-like-suspended-_0028tty-output_0029_003f" href="#How-do-I-prevent-ffmpeg-from-suspending-with-a-message-like-suspended-_0028tty-output_0029_003f">3.20 How do I prevent ffmpeg from suspending with a message like <em class="emph">suspended (tty output)</em>?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Development" href="#Development">4 Development</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Are-there-examples-illustrating-how-to-use-the-FFmpeg-libraries_002c-particularly-libavcodec-and-libavformat_003f" href="#Are-there-examples-illustrating-how-to-use-the-FFmpeg-libraries_002c-particularly-libavcodec-and-libavformat_003f">4.1 Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?</a></li>
|
|
||||||
<li><a id="toc-Can-you-support-my-C-compiler-XXX_003f" href="#Can-you-support-my-C-compiler-XXX_003f">4.2 Can you support my C compiler XXX?</a></li>
|
|
||||||
<li><a id="toc-Is-Microsoft-Visual-C_002b_002b-supported_003f" href="#Is-Microsoft-Visual-C_002b_002b-supported_003f">4.3 Is Microsoft Visual C++ supported?</a></li>
|
|
||||||
<li><a id="toc-Can-you-add-automake_002c-libtool-or-autoconf-support_003f" href="#Can-you-add-automake_002c-libtool-or-autoconf-support_003f">4.4 Can you add automake, libtool or autoconf support?</a></li>
|
|
||||||
<li><a id="toc-Why-not-rewrite-FFmpeg-in-object_002doriented-C_002b_002b_003f" href="#Why-not-rewrite-FFmpeg-in-object_002doriented-C_002b_002b_003f">4.5 Why not rewrite FFmpeg in object-oriented C++?</a></li>
|
|
||||||
<li><a id="toc-Why-are-the-ffmpeg-programs-devoid-of-debugging-symbols_003f" href="#Why-are-the-ffmpeg-programs-devoid-of-debugging-symbols_003f">4.6 Why are the ffmpeg programs devoid of debugging symbols?</a></li>
|
|
||||||
<li><a id="toc-I-do-not-like-the-LGPL_002c-can-I-contribute-code-under-the-GPL-instead_003f" href="#I-do-not-like-the-LGPL_002c-can-I-contribute-code-under-the-GPL-instead_003f">4.7 I do not like the LGPL, can I contribute code under the GPL instead?</a></li>
|
|
||||||
<li><a id="toc-I_0027m-using-FFmpeg-from-within-my-C-application-but-the-linker-complains-about-missing-symbols-from-the-libraries-themselves_002e" href="#I_0027m-using-FFmpeg-from-within-my-C-application-but-the-linker-complains-about-missing-symbols-from-the-libraries-themselves_002e">4.8 I’m using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.</a></li>
|
|
||||||
<li><a id="toc-I_0027m-using-FFmpeg-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e" href="#I_0027m-using-FFmpeg-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e">4.9 I’m using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.</a></li>
|
|
||||||
<li><a id="toc-I_0027m-using-libavutil-from-within-my-C_002b_002b-application-but-the-compiler-complains-about-_0027UINT64_005fC_0027-was-not-declared-in-this-scope" href="#I_0027m-using-libavutil-from-within-my-C_002b_002b-application-but-the-compiler-complains-about-_0027UINT64_005fC_0027-was-not-declared-in-this-scope">4.10 I’m using libavutil from within my C++ application but the compiler complains about ’UINT64_C’ was not declared in this scope</a></li>
|
|
||||||
<li><a id="toc-I-have-a-file-in-memory-_002f-a-API-different-from-_002aopen_002f_002aread_002f-libc-how-do-I-use-it-with-libavformat_003f" href="#I-have-a-file-in-memory-_002f-a-API-different-from-_002aopen_002f_002aread_002f-libc-how-do-I-use-it-with-libavformat_003f">4.11 I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?</a></li>
|
|
||||||
<li><a id="toc-Where-is-the-documentation-about-ffv1_002c-msmpeg4_002c-asv1_002c-4xm_003f" href="#Where-is-the-documentation-about-ffv1_002c-msmpeg4_002c-asv1_002c-4xm_003f">4.12 Where is the documentation about ffv1, msmpeg4, asv1, 4xm?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-feed-H_002e263_002dRTP-_0028and-other-codecs-in-RTP_0029-to-libavcodec_003f" href="#How-do-I-feed-H_002e263_002dRTP-_0028and-other-codecs-in-RTP_0029-to-libavcodec_003f">4.13 How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?</a></li>
|
|
||||||
<li><a id="toc-AVStream_002er_005fframe_005frate-is-wrong_002c-it-is-much-larger-than-the-frame-rate_002e" href="#AVStream_002er_005fframe_005frate-is-wrong_002c-it-is-much-larger-than-the-frame-rate_002e">4.14 AVStream.r_frame_rate is wrong, it is much larger than the frame rate.</a></li>
|
|
||||||
<li><a id="toc-Why-is-make-fate-not-running-all-tests_003f" href="#Why-is-make-fate-not-running-all-tests_003f">4.15 Why is <code class="code">make fate</code> not running all tests?</a></li>
|
|
||||||
<li><a id="toc-Why-is-make-fate-not-finding-the-samples_003f" href="#Why-is-make-fate-not-finding-the-samples_003f">4.16 Why is <code class="code">make fate</code> not finding the samples?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="General-Questions">
|
|
||||||
<h2 class="chapter">1 General Questions</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Why-doesn_0027t-FFmpeg-support-feature-_005bxyz_005d_003f" accesskey="1">Why doesn’t FFmpeg support feature [xyz]?</a></li>
|
|
||||||
<li><a href="#FFmpeg-does-not-support-codec-XXX_002e-Can-you-include-a-Windows-DLL-loader-to-support-it_003f" accesskey="2">FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?</a></li>
|
|
||||||
<li><a href="#I-cannot-read-this-file-although-this-format-seems-to-be-supported-by-ffmpeg_002e" accesskey="3">I cannot read this file although this format seems to be supported by ffmpeg.</a></li>
|
|
||||||
<li><a href="#Which-codecs-are-supported-by-Windows_003f" accesskey="4">Which codecs are supported by Windows?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Why-doesn_0027t-FFmpeg-support-feature-_005bxyz_005d_003f">
|
|
||||||
<h3 class="section">1.1 Why doesn’t FFmpeg support feature [xyz]?</h3>
|
|
||||||
|
|
||||||
<p>Because no one has taken on that task yet. FFmpeg development is
|
|
||||||
driven by the tasks that are important to the individual developers.
|
|
||||||
If there is a feature that is important to you, the best way to get
|
|
||||||
it implemented is to undertake the task yourself or sponsor a developer.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="FFmpeg-does-not-support-codec-XXX_002e-Can-you-include-a-Windows-DLL-loader-to-support-it_003f">
|
|
||||||
<h3 class="section">1.2 FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?</h3>
|
|
||||||
|
|
||||||
<p>No. Windows DLLs are not portable, bloated and often slow.
|
|
||||||
Moreover FFmpeg strives to support all codecs natively.
|
|
||||||
A DLL loader is not conducive to that goal.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="I-cannot-read-this-file-although-this-format-seems-to-be-supported-by-ffmpeg_002e">
|
|
||||||
<h3 class="section">1.3 I cannot read this file although this format seems to be supported by ffmpeg.</h3>
|
|
||||||
|
|
||||||
<p>Even if ffmpeg can read the container format, it may not support all its
|
|
||||||
codecs. Please consult the supported codec list in the ffmpeg
|
|
||||||
documentation.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Which-codecs-are-supported-by-Windows_003f">
|
|
||||||
<h3 class="section">1.4 Which codecs are supported by Windows?</h3>
|
|
||||||
|
|
||||||
<p>Windows does not support standard formats like MPEG very well, unless you
|
|
||||||
install some additional codecs.
|
|
||||||
</p>
|
|
||||||
<p>The following list of video codecs should work on most Windows systems:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt><samp class="option">msmpeg4v2</samp></dt>
|
|
||||||
<dd><p>.avi/.asf
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">msmpeg4</samp></dt>
|
|
||||||
<dd><p>.asf only
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">wmv1</samp></dt>
|
|
||||||
<dd><p>.asf only
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">wmv2</samp></dt>
|
|
||||||
<dd><p>.asf only
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">mpeg4</samp></dt>
|
|
||||||
<dd><p>Only if you have some MPEG-4 codec like ffdshow or Xvid installed.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">mpeg1video</samp></dt>
|
|
||||||
<dd><p>.mpg only
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
<p>Note, ASF files often have .wmv or .wma extensions in Windows. It should also
|
|
||||||
be mentioned that Microsoft claims a patent on the ASF format, and may sue
|
|
||||||
or threaten users who create ASF files with non-Microsoft software. It is
|
|
||||||
strongly advised to avoid ASF where possible.
|
|
||||||
</p>
|
|
||||||
<p>The following list of audio codecs should work on most Windows systems:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt><samp class="option">adpcm_ima_wav</samp></dt>
|
|
||||||
<dt><samp class="option">adpcm_ms</samp></dt>
|
|
||||||
<dt><samp class="option">pcm_s16le</samp></dt>
|
|
||||||
<dd><p>always
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">libmp3lame</samp></dt>
|
|
||||||
<dd><p>If some MP3 codec like LAME is installed.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Compilation">
|
|
||||||
<h2 class="chapter">2 Compilation</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#error_003a-can_0027t-find-a-register-in-class-_0027GENERAL_005fREGS_0027-while-reloading-_0027asm_0027" accesskey="1"><code class="code">error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'</code></a></li>
|
|
||||||
<li><a href="#I-have-installed-this-library-with-my-distro_0027s-package-manager_002e-Why-does-configure-not-see-it_003f" accesskey="2">I have installed this library with my distro’s package manager. Why does <code class="command">configure</code> not see it?</a></li>
|
|
||||||
<li><a href="#How-do-I-make-pkg_002dconfig-find-my-libraries_003f" accesskey="3">How do I make <code class="command">pkg-config</code> find my libraries?</a></li>
|
|
||||||
<li><a href="#How-do-I-use-pkg_002dconfig-when-cross_002dcompiling_003f" accesskey="4">How do I use <code class="command">pkg-config</code> when cross-compiling?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="error_003a-can_0027t-find-a-register-in-class-_0027GENERAL_005fREGS_0027-while-reloading-_0027asm_0027">
|
|
||||||
<h3 class="section">2.1 <code class="code">error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'</code></h3>
|
|
||||||
|
|
||||||
<p>This is a bug in gcc. Do not report it to us. Instead, please report it to
|
|
||||||
the gcc developers. Note that we will not add workarounds for gcc bugs.
|
|
||||||
</p>
|
|
||||||
<p>Also note that (some of) the gcc developers believe this is not a bug or
|
|
||||||
not a bug they should fix:
|
|
||||||
<a class="url" href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203">https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203</a>.
|
|
||||||
Then again, some of them do not know the difference between an undecidable
|
|
||||||
problem and an NP-hard problem...
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="I-have-installed-this-library-with-my-distro_0027s-package-manager_002e-Why-does-configure-not-see-it_003f">
|
|
||||||
<h3 class="section">2.2 I have installed this library with my distro’s package manager. Why does <code class="command">configure</code> not see it?</h3>
|
|
||||||
|
|
||||||
<p>Distributions usually split libraries in several packages. The main package
|
|
||||||
contains the files necessary to run programs using the library. The
|
|
||||||
development package contains the files necessary to build programs using the
|
|
||||||
library. Sometimes, docs and/or data are in a separate package too.
|
|
||||||
</p>
|
|
||||||
<p>To build FFmpeg, you need to install the development package. It is usually
|
|
||||||
called <samp class="file">libfoo-dev</samp> or <samp class="file">libfoo-devel</samp>. You can remove it after the
|
|
||||||
build is finished, but be sure to keep the main package.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-make-pkg_002dconfig-find-my-libraries_003f">
|
|
||||||
<h3 class="section">2.3 How do I make <code class="command">pkg-config</code> find my libraries?</h3>
|
|
||||||
|
|
||||||
<p>Somewhere along with your libraries, there is a <samp class="file">.pc</samp> file (or several)
|
|
||||||
in a <samp class="file">pkgconfig</samp> directory. You need to set environment variables to
|
|
||||||
point <code class="command">pkg-config</code> to these files.
|
|
||||||
</p>
|
|
||||||
<p>If you need to <em class="emph">add</em> directories to <code class="command">pkg-config</code>’s search list
|
|
||||||
(typical use case: library installed separately), add it to
|
|
||||||
<code class="code">$PKG_CONFIG_PATH</code>:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If you need to <em class="emph">replace</em> <code class="command">pkg-config</code>’s search list
|
|
||||||
(typical use case: cross-compiling), set it in
|
|
||||||
<code class="code">$PKG_CONFIG_LIBDIR</code>:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If you need to know the library’s internal dependencies (typical use: static
|
|
||||||
linking), add the <code class="code">--static</code> option to <code class="command">pkg-config</code>:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">./configure --pkg-config-flags=--static
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-use-pkg_002dconfig-when-cross_002dcompiling_003f">
|
|
||||||
<h3 class="section">2.4 How do I use <code class="command">pkg-config</code> when cross-compiling?</h3>
|
|
||||||
|
|
||||||
<p>The best way is to install <code class="command">pkg-config</code> in your cross-compilation
|
|
||||||
environment. It will automatically use the cross-compilation libraries.
|
|
||||||
</p>
|
|
||||||
<p>You can also use <code class="command">pkg-config</code> from the host environment by
|
|
||||||
specifying explicitly <code class="code">--pkg-config=pkg-config</code> to <code class="command">configure</code>.
|
|
||||||
In that case, you must point <code class="command">pkg-config</code> to the correct directories
|
|
||||||
using the <code class="code">PKG_CONFIG_LIBDIR</code>, as explained in the previous entry.
|
|
||||||
</p>
|
|
||||||
<p>As an intermediate solution, you can place in your cross-compilation
|
|
||||||
environment a script that calls the host <code class="command">pkg-config</code> with
|
|
||||||
<code class="code">PKG_CONFIG_LIBDIR</code> set. That script can look like that:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">#!/bin/sh
|
|
||||||
PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
|
|
||||||
export PKG_CONFIG_LIBDIR
|
|
||||||
exec /usr/bin/pkg-config "$@"
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Usage">
|
|
||||||
<h2 class="chapter">3 Usage</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#ffmpeg-does-not-work_003b-what-is-wrong_003f" accesskey="1">ffmpeg does not work; what is wrong?</a></li>
|
|
||||||
<li><a href="#How-do-I-encode-single-pictures-into-movies_003f" accesskey="2">How do I encode single pictures into movies?</a></li>
|
|
||||||
<li><a href="#How-do-I-encode-movie-to-single-pictures_003f" accesskey="3">How do I encode movie to single pictures?</a></li>
|
|
||||||
<li><a href="#Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f" accesskey="4">Why do I see a slight quality degradation with multithreaded MPEG* encoding?</a></li>
|
|
||||||
<li><a href="#How-can-I-read-from-the-standard-input-or-write-to-the-standard-output_003f" accesskey="5">How can I read from the standard input or write to the standard output?</a></li>
|
|
||||||
<li><a href="#g_t_002df-jpeg-doesn_0027t-work_002e" accesskey="6">-f jpeg doesn’t work.</a></li>
|
|
||||||
<li><a href="#Why-can-I-not-change-the-frame-rate_003f" accesskey="7">Why can I not change the frame rate?</a></li>
|
|
||||||
<li><a href="#How-do-I-encode-Xvid-or-DivX-video-with-ffmpeg_003f" accesskey="8">How do I encode Xvid or DivX video with ffmpeg?</a></li>
|
|
||||||
<li><a href="#Which-are-good-parameters-for-encoding-high-quality-MPEG_002d4_003f" accesskey="9">Which are good parameters for encoding high quality MPEG-4?</a></li>
|
|
||||||
<li><a href="#Which-are-good-parameters-for-encoding-high-quality-MPEG_002d1_002fMPEG_002d2_003f">Which are good parameters for encoding high quality MPEG-1/MPEG-2?</a></li>
|
|
||||||
<li><a href="#Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f">Interlaced video looks very bad when encoded with ffmpeg, what is wrong?</a></li>
|
|
||||||
<li><a href="#How-can-I-read-DirectShow-files_003f">How can I read DirectShow files?</a></li>
|
|
||||||
<li><a href="#How-can-I-join-video-files_003f">How can I join video files?</a></li>
|
|
||||||
<li><a href="#How-can-I-concatenate-video-files_003f">How can I concatenate video files?</a></li>
|
|
||||||
<li><a href="#Using-_002df-lavfi_002c-audio-becomes-mono-for-no-apparent-reason_002e">Using <samp class="option">-f lavfi</samp>, audio becomes mono for no apparent reason.</a></li>
|
|
||||||
<li><a href="#Why-does-FFmpeg-not-see-the-subtitles-in-my-VOB-file_003f">Why does FFmpeg not see the subtitles in my VOB file?</a></li>
|
|
||||||
<li><a href="#Why-was-the-ffmpeg-_002dsameq-option-removed_003f-What-to-use-instead_003f">Why was the <code class="command">ffmpeg</code> <samp class="option">-sameq</samp> option removed? What to use instead?</a></li>
|
|
||||||
<li><a href="#I-have-a-stretched-video_002c-why-does-scaling-does-not-fix-it_003f">I have a stretched video, why does scaling does not fix it?</a></li>
|
|
||||||
<li><a href="#How-do-I-run-ffmpeg-as-a-background-task_003f">How do I run ffmpeg as a background task?</a></li>
|
|
||||||
<li><a href="#How-do-I-prevent-ffmpeg-from-suspending-with-a-message-like-suspended-_0028tty-output_0029_003f">How do I prevent ffmpeg from suspending with a message like <em class="emph">suspended (tty output)</em>?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="ffmpeg-does-not-work_003b-what-is-wrong_003f">
|
|
||||||
<h3 class="section">3.1 ffmpeg does not work; what is wrong?</h3>
|
|
||||||
|
|
||||||
<p>Try a <code class="code">make distclean</code> in the ffmpeg source directory before the build.
|
|
||||||
If this does not help see
|
|
||||||
(<a class="url" href="https://ffmpeg.org/bugreports.html">https://ffmpeg.org/bugreports.html</a>).
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-encode-single-pictures-into-movies_003f">
|
|
||||||
<h3 class="section">3.2 How do I encode single pictures into movies?</h3>
|
|
||||||
|
|
||||||
<p>First, rename your pictures to follow a numerical sequence.
|
|
||||||
For example, img1.jpg, img2.jpg, img3.jpg,...
|
|
||||||
Then you may run:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Notice that ‘<samp class="samp">%d</samp>’ is replaced by the image number.
|
|
||||||
</p>
|
|
||||||
<p><samp class="file">img%03d.jpg</samp> means the sequence <samp class="file">img001.jpg</samp>, <samp class="file">img002.jpg</samp>, etc.
|
|
||||||
</p>
|
|
||||||
<p>Use the <samp class="option">-start_number</samp> option to declare a starting number for
|
|
||||||
the sequence. This is useful if your sequence does not start with
|
|
||||||
<samp class="file">img001.jpg</samp> but is still in a numerical order. The following
|
|
||||||
example will start with <samp class="file">img100.jpg</samp>:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If you have large number of pictures to rename, you can use the
|
|
||||||
following command to ease the burden. The command, using the bourne
|
|
||||||
shell syntax, symbolically links all files in the current directory
|
|
||||||
that match <code class="code">*jpg</code> to the <samp class="file">/tmp</samp> directory in the sequence of
|
|
||||||
<samp class="file">img001.jpg</samp>, <samp class="file">img002.jpg</samp> and so on.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If you want to sequence them by oldest modified first, substitute
|
|
||||||
<code class="code">$(ls -r -t *jpg)</code> in place of <code class="code">*jpg</code>.
|
|
||||||
</p>
|
|
||||||
<p>Then run:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>The same logic is used for any image format that ffmpeg reads.
|
|
||||||
</p>
|
|
||||||
<p>You can also use <code class="command">cat</code> to pipe images to ffmpeg:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-encode-movie-to-single-pictures_003f">
|
|
||||||
<h3 class="section">3.3 How do I encode movie to single pictures?</h3>
|
|
||||||
|
|
||||||
<p>Use:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i movie.mpg movie%d.jpg
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>The <samp class="file">movie.mpg</samp> used as input will be converted to
|
|
||||||
<samp class="file">movie1.jpg</samp>, <samp class="file">movie2.jpg</samp>, etc...
|
|
||||||
</p>
|
|
||||||
<p>Instead of relying on file format self-recognition, you may also use
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt><samp class="option">-c:v ppm</samp></dt>
|
|
||||||
<dt><samp class="option">-c:v png</samp></dt>
|
|
||||||
<dt><samp class="option">-c:v mjpeg</samp></dt>
|
|
||||||
</dl>
|
|
||||||
<p>to force the encoding.
|
|
||||||
</p>
|
|
||||||
<p>Applying that to the previous example:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Beware that there is no "jpeg" codec. Use "mjpeg" instead.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-do-I-see-a-slight-quality-degradation-with-multithreaded-MPEG_002a-encoding_003f">
|
|
||||||
<h3 class="section">3.4 Why do I see a slight quality degradation with multithreaded MPEG* encoding?</h3>
|
|
||||||
|
|
||||||
<p>For multithreaded MPEG* encoding, the encoded slices must be independent,
|
|
||||||
otherwise thread n would practically have to wait for n-1 to finish, so it’s
|
|
||||||
quite logical that there is a small reduction of quality. This is not a bug.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-can-I-read-from-the-standard-input-or-write-to-the-standard-output_003f">
|
|
||||||
<h3 class="section">3.5 How can I read from the standard input or write to the standard output?</h3>
|
|
||||||
|
|
||||||
<p>Use <samp class="file">-</samp> as file name.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="g_t_002df-jpeg-doesn_0027t-work_002e">
|
|
||||||
<h3 class="section">3.6 -f jpeg doesn’t work.</h3>
|
|
||||||
|
|
||||||
<p>Try ’-f image2 test%d.jpg’.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-can-I-not-change-the-frame-rate_003f">
|
|
||||||
<h3 class="section">3.7 Why can I not change the frame rate?</h3>
|
|
||||||
|
|
||||||
<p>Some codecs, like MPEG-1/2, only allow a small number of fixed frame rates.
|
|
||||||
Choose a different codec with the -c:v command line option.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-encode-Xvid-or-DivX-video-with-ffmpeg_003f">
|
|
||||||
<h3 class="section">3.8 How do I encode Xvid or DivX video with ffmpeg?</h3>
|
|
||||||
|
|
||||||
<p>Both Xvid and DivX (version 4+) are implementations of the ISO MPEG-4
|
|
||||||
standard (note that there are many other coding formats that use this
|
|
||||||
same standard). Thus, use ’-c:v mpeg4’ to encode in these formats. The
|
|
||||||
default fourcc stored in an MPEG-4-coded file will be ’FMP4’. If you want
|
|
||||||
a different fourcc, use the ’-vtag’ option. E.g., ’-vtag xvid’ will
|
|
||||||
force the fourcc ’xvid’ to be stored as the video fourcc rather than the
|
|
||||||
default.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Which-are-good-parameters-for-encoding-high-quality-MPEG_002d4_003f">
|
|
||||||
<h3 class="section">3.9 Which are good parameters for encoding high quality MPEG-4?</h3>
|
|
||||||
|
|
||||||
<p>’-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2’,
|
|
||||||
things to try: ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Which-are-good-parameters-for-encoding-high-quality-MPEG_002d1_002fMPEG_002d2_003f">
|
|
||||||
<h3 class="section">3.10 Which are good parameters for encoding high quality MPEG-1/MPEG-2?</h3>
|
|
||||||
|
|
||||||
<p>’-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’
|
|
||||||
but beware the ’-g 100’ might cause problems with some decoders.
|
|
||||||
Things to try: ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Interlaced-video-looks-very-bad-when-encoded-with-ffmpeg_002c-what-is-wrong_003f">
|
|
||||||
<h3 class="section">3.11 Interlaced video looks very bad when encoded with ffmpeg, what is wrong?</h3>
|
|
||||||
|
|
||||||
<p>You should use ’-flags +ilme+ildct’ and maybe ’-flags +alt’ for interlaced
|
|
||||||
material, and try ’-top 0/1’ if the result looks really messed-up.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-can-I-read-DirectShow-files_003f">
|
|
||||||
<h3 class="section">3.12 How can I read DirectShow files?</h3>
|
|
||||||
|
|
||||||
<p>If you have built FFmpeg with <code class="code">./configure --enable-avisynth</code>
|
|
||||||
(only possible on MinGW/Cygwin platforms),
|
|
||||||
then you may use any file that DirectShow can read as input.
|
|
||||||
</p>
|
|
||||||
<p>Just create an "input.avs" text file with this single line ...
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">DirectShowSource("C:\path to your file\yourfile.asf")
|
|
||||||
</pre></div>
|
|
||||||
<p>... and then feed that text file to ffmpeg:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i input.avs
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>For ANY other help on AviSynth, please visit the
|
|
||||||
<a class="uref" href="http://www.avisynth.org/">AviSynth homepage</a>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-can-I-join-video-files_003f">
|
|
||||||
<h3 class="section">3.13 How can I join video files?</h3>
|
|
||||||
|
|
||||||
<p>To "join" video files is quite ambiguous. The following list explains the
|
|
||||||
different kinds of "joining" and points out how those are addressed in
|
|
||||||
FFmpeg. To join video files may mean:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>To put them one after the other: this is called to <em class="emph">concatenate</em> them
|
|
||||||
(in short: concat) and is addressed
|
|
||||||
<a class="ref" href="#How-can-I-concatenate-video-files">in this very faq</a>.
|
|
||||||
|
|
||||||
</li><li>To put them together in the same file, to let the user choose between the
|
|
||||||
different versions (example: different audio languages): this is called to
|
|
||||||
<em class="emph">multiplex</em> them together (in short: mux), and is done by simply
|
|
||||||
invoking ffmpeg with several <samp class="option">-i</samp> options.
|
|
||||||
|
|
||||||
</li><li>For audio, to put all channels together in a single stream (example: two
|
|
||||||
mono streams into one stereo stream): this is sometimes called to
|
|
||||||
<em class="emph">merge</em> them, and can be done using the
|
|
||||||
<a class="url" href="ffmpeg-filters.html#amerge"><code class="code">amerge</code></a> filter.
|
|
||||||
|
|
||||||
</li><li>For audio, to play one on top of the other: this is called to <em class="emph">mix</em>
|
|
||||||
them, and can be done by first merging them into a single stream and then
|
|
||||||
using the <a class="url" href="ffmpeg-filters.html#pan"><code class="code">pan</code></a> filter to mix
|
|
||||||
the channels at will.
|
|
||||||
|
|
||||||
</li><li>For video, to display both together, side by side or one on top of a part of
|
|
||||||
the other; it can be done using the
|
|
||||||
<a class="url" href="ffmpeg-filters.html#overlay"><code class="code">overlay</code></a> video filter.
|
|
||||||
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<a class="anchor" id="How-can-I-concatenate-video-files"></a></div>
|
|
||||||
<div class="section-level-extent" id="How-can-I-concatenate-video-files_003f">
|
|
||||||
<h3 class="section">3.14 How can I concatenate video files?</h3>
|
|
||||||
|
|
||||||
<p>There are several solutions, depending on the exact circumstances.
|
|
||||||
</p>
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Concatenating-using-the-concat-filter" accesskey="1">Concatenating using the concat <em class="emph">filter</em></a></li>
|
|
||||||
<li><a href="#Concatenating-using-the-concat-demuxer" accesskey="2">Concatenating using the concat <em class="emph">demuxer</em></a></li>
|
|
||||||
<li><a href="#Concatenating-using-the-concat-protocol-_0028file-level_0029" accesskey="3">Concatenating using the concat <em class="emph">protocol</em> (file level)</a></li>
|
|
||||||
<li><a href="#Concatenating-using-raw-audio-and-video" accesskey="4">Concatenating using raw audio and video</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="subsection-level-extent" id="Concatenating-using-the-concat-filter">
|
|
||||||
<h4 class="subsection">3.14.1 Concatenating using the concat <em class="emph">filter</em></h4>
|
|
||||||
|
|
||||||
<p>FFmpeg has a <a class="url" href="ffmpeg-filters.html#concat"><code class="code">concat</code></a> filter designed specifically for that, with examples in the
|
|
||||||
documentation. This operation is recommended if you need to re-encode.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="subsection-level-extent" id="Concatenating-using-the-concat-demuxer">
|
|
||||||
<h4 class="subsection">3.14.2 Concatenating using the concat <em class="emph">demuxer</em></h4>
|
|
||||||
|
|
||||||
<p>FFmpeg has a <a class="url" href="ffmpeg-formats.html#concat"><code class="code">concat</code></a> demuxer which you can use when you want to avoid a re-encode and
|
|
||||||
your format doesn’t support file level concatenation.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="subsection-level-extent" id="Concatenating-using-the-concat-protocol-_0028file-level_0029">
|
|
||||||
<h4 class="subsection">3.14.3 Concatenating using the concat <em class="emph">protocol</em> (file level)</h4>
|
|
||||||
|
|
||||||
<p>FFmpeg has a <a class="url" href="ffmpeg-protocols.html#concat"><code class="code">concat</code></a> protocol designed specifically for that, with examples in the
|
|
||||||
documentation.
|
|
||||||
</p>
|
|
||||||
<p>A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow one to concatenate
|
|
||||||
video by merely concatenating the files containing them.
|
|
||||||
</p>
|
|
||||||
<p>Hence you may concatenate your multimedia files by first transcoding them to
|
|
||||||
these privileged formats, then using the humble <code class="code">cat</code> command (or the
|
|
||||||
equally humble <code class="code">copy</code> under Windows), and finally transcoding back to your
|
|
||||||
format of choice.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
|
|
||||||
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
|
|
||||||
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
|
|
||||||
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Additionally, you can use the <code class="code">concat</code> protocol instead of <code class="code">cat</code> or
|
|
||||||
<code class="code">copy</code> which will avoid creation of a potentially huge intermediate file.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
|
|
||||||
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
|
|
||||||
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
|
|
||||||
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Note that you may need to escape the character "|" which is special for many
|
|
||||||
shells.
|
|
||||||
</p>
|
|
||||||
<p>Another option is usage of named pipes, should your platform support it:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">mkfifo intermediate1.mpg
|
|
||||||
mkfifo intermediate2.mpg
|
|
||||||
ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
|
|
||||||
ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
|
|
||||||
cat intermediate1.mpg intermediate2.mpg |\
|
|
||||||
ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="subsection-level-extent" id="Concatenating-using-raw-audio-and-video">
|
|
||||||
<h4 class="subsection">3.14.4 Concatenating using raw audio and video</h4>
|
|
||||||
|
|
||||||
<p>Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also
|
|
||||||
allow concatenation, and the transcoding step is almost lossless.
|
|
||||||
When using multiple yuv4mpegpipe(s), the first line needs to be discarded
|
|
||||||
from all but the first stream. This can be accomplished by piping through
|
|
||||||
<code class="code">tail</code> as seen below. Note that when piping through <code class="code">tail</code> you
|
|
||||||
must use command grouping, <code class="code">{ ;}</code>, to background properly.
|
|
||||||
</p>
|
|
||||||
<p>For example, let’s say we want to concatenate two FLV files into an
|
|
||||||
output.flv file:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">mkfifo temp1.a
|
|
||||||
mkfifo temp1.v
|
|
||||||
mkfifo temp2.a
|
|
||||||
mkfifo temp2.v
|
|
||||||
mkfifo all.a
|
|
||||||
mkfifo all.v
|
|
||||||
ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
|
|
||||||
ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
|
|
||||||
ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
|
|
||||||
{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } &
|
|
||||||
cat temp1.a temp2.a > all.a &
|
|
||||||
cat temp1.v temp2.v > all.v &
|
|
||||||
ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
|
|
||||||
-f yuv4mpegpipe -i all.v \
|
|
||||||
-y output.flv
|
|
||||||
rm temp[12].[av] all.[av]
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Using-_002df-lavfi_002c-audio-becomes-mono-for-no-apparent-reason_002e">
|
|
||||||
<h3 class="section">3.15 Using <samp class="option">-f lavfi</samp>, audio becomes mono for no apparent reason.</h3>
|
|
||||||
|
|
||||||
<p>Use <samp class="option">-dumpgraph -</samp> to find out exactly where the channel layout is
|
|
||||||
lost.
|
|
||||||
</p>
|
|
||||||
<p>Most likely, it is through <code class="code">auto-inserted aresample</code>. Try to understand
|
|
||||||
why the converting filter was needed at that place.
|
|
||||||
</p>
|
|
||||||
<p>Just before the output is a likely place, as <samp class="option">-f lavfi</samp> currently
|
|
||||||
only support packed S16.
|
|
||||||
</p>
|
|
||||||
<p>Then insert the correct <code class="code">aformat</code> explicitly in the filtergraph,
|
|
||||||
specifying the exact format.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">aformat=sample_fmts=s16:channel_layouts=stereo
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-does-FFmpeg-not-see-the-subtitles-in-my-VOB-file_003f">
|
|
||||||
<h3 class="section">3.16 Why does FFmpeg not see the subtitles in my VOB file?</h3>
|
|
||||||
|
|
||||||
<p>VOB and a few other formats do not have a global header that describes
|
|
||||||
everything present in the file. Instead, applications are supposed to scan
|
|
||||||
the file to see what it contains. Since VOB files are frequently large, only
|
|
||||||
the beginning is scanned. If the subtitles happen only later in the file,
|
|
||||||
they will not be initially detected.
|
|
||||||
</p>
|
|
||||||
<p>Some applications, including the <code class="code">ffmpeg</code> command-line tool, can only
|
|
||||||
work with streams that were detected during the initial scan; streams that
|
|
||||||
are detected later are ignored.
|
|
||||||
</p>
|
|
||||||
<p>The size of the initial scan is controlled by two options: <code class="code">probesize</code>
|
|
||||||
(default ~5 Mo) and <code class="code">analyzeduration</code> (default 5,000,000 µs = 5 s). For
|
|
||||||
the subtitle stream to be detected, both values must be large enough.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-was-the-ffmpeg-_002dsameq-option-removed_003f-What-to-use-instead_003f">
|
|
||||||
<h3 class="section">3.17 Why was the <code class="command">ffmpeg</code> <samp class="option">-sameq</samp> option removed? What to use instead?</h3>
|
|
||||||
|
|
||||||
<p>The <samp class="option">-sameq</samp> option meant "same quantizer", and made sense only in a
|
|
||||||
very limited set of cases. Unfortunately, a lot of people mistook it for
|
|
||||||
"same quality" and used it in places where it did not make sense: it had
|
|
||||||
roughly the expected visible effect, but achieved it in a very inefficient
|
|
||||||
way.
|
|
||||||
</p>
|
|
||||||
<p>Each encoder has its own set of options to set the quality-vs-size balance,
|
|
||||||
use the options for the encoder you are using to set the quality level to a
|
|
||||||
point acceptable for your tastes. The most common options to do that are
|
|
||||||
<samp class="option">-qscale</samp> and <samp class="option">-qmax</samp>, but you should peruse the documentation
|
|
||||||
of the encoder you chose.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="I-have-a-stretched-video_002c-why-does-scaling-does-not-fix-it_003f">
|
|
||||||
<h3 class="section">3.18 I have a stretched video, why does scaling does not fix it?</h3>
|
|
||||||
|
|
||||||
<p>A lot of video codecs and formats can store the <em class="emph">aspect ratio</em> of the
|
|
||||||
video: this is the ratio between the width and the height of either the full
|
|
||||||
image (DAR, display aspect ratio) or individual pixels (SAR, sample aspect
|
|
||||||
ratio). For example, EGA screens at resolution 640×350 had 4:3 DAR and 35:48
|
|
||||||
SAR.
|
|
||||||
</p>
|
|
||||||
<p>Most still image processing work with square pixels, i.e. 1:1 SAR, but a lot
|
|
||||||
of video standards, especially from the analogic-numeric transition era, use
|
|
||||||
non-square pixels.
|
|
||||||
</p>
|
|
||||||
<p>Most processing filters in FFmpeg handle the aspect ratio to avoid
|
|
||||||
stretching the image: cropping adjusts the DAR to keep the SAR constant,
|
|
||||||
scaling adjusts the SAR to keep the DAR constant.
|
|
||||||
</p>
|
|
||||||
<p>If you want to stretch, or “unstretch”, the image, you need to override the
|
|
||||||
information with the
|
|
||||||
<a class="url" href="ffmpeg-filters.html#setdar_002c-setsar"><code class="code">setdar or setsar filters</code></a>.
|
|
||||||
</p>
|
|
||||||
<p>Do not forget to examine carefully the original video to check whether the
|
|
||||||
stretching comes from the image or from the aspect ratio information.
|
|
||||||
</p>
|
|
||||||
<p>For example, to fix a badly encoded EGA capture, use the following commands,
|
|
||||||
either the first one to upscale to square pixels or the second one to set
|
|
||||||
the correct aspect ratio or the third one to avoid transcoding (may not work
|
|
||||||
depending on the format / codec / player / phase of the moon):
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
|
|
||||||
ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
|
|
||||||
ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<a class="anchor" id="background-task"></a></div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-run-ffmpeg-as-a-background-task_003f">
|
|
||||||
<h3 class="section">3.19 How do I run ffmpeg as a background task?</h3>
|
|
||||||
|
|
||||||
<p>ffmpeg normally checks the console input, for entries like "q" to stop
|
|
||||||
and "?" to give help, while performing operations. ffmpeg does not have a way of
|
|
||||||
detecting when it is running as a background task.
|
|
||||||
When it checks the console input, that can cause the process running ffmpeg
|
|
||||||
in the background to suspend.
|
|
||||||
</p>
|
|
||||||
<p>To prevent those input checks, allowing ffmpeg to run as a background task,
|
|
||||||
use the <a class="url" href="ffmpeg.html#stdin-option"><code class="code">-nostdin</code> option</a>
|
|
||||||
in the ffmpeg invocation. This is effective whether you run ffmpeg in a shell
|
|
||||||
or invoke ffmpeg in its own process via an operating system API.
|
|
||||||
</p>
|
|
||||||
<p>As an alternative, when you are running ffmpeg in a shell, you can redirect
|
|
||||||
standard input to <code class="code">/dev/null</code> (on Linux and macOS)
|
|
||||||
or <code class="code">NUL</code> (on Windows). You can do this redirect either
|
|
||||||
on the ffmpeg invocation, or from a shell script which calls ffmpeg.
|
|
||||||
</p>
|
|
||||||
<p>For example:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -nostdin -i INPUT OUTPUT
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>or (on Linux, macOS, and other UNIX-like shells):
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i INPUT OUTPUT </dev/null
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>or (on Windows):
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i INPUT OUTPUT <NUL
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-prevent-ffmpeg-from-suspending-with-a-message-like-suspended-_0028tty-output_0029_003f">
|
|
||||||
<h3 class="section">3.20 How do I prevent ffmpeg from suspending with a message like <em class="emph">suspended (tty output)</em>?</h3>
|
|
||||||
|
|
||||||
<p>If you run ffmpeg in the background, you may find that its process suspends.
|
|
||||||
There may be a message like <em class="emph">suspended (tty output)</em>. The question is how
|
|
||||||
to prevent the process from being suspended.
|
|
||||||
</p>
|
|
||||||
<p>For example:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt &
|
|
||||||
[1] 93352
|
|
||||||
%
|
|
||||||
[1] + suspended (tty output) ffmpeg -i INPUT OUTPUT &>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>The message "tty output" notwithstanding, the problem here is that
|
|
||||||
ffmpeg normally checks the console input when it runs. The operating system
|
|
||||||
detects this, and suspends the process until you can bring it to the
|
|
||||||
foreground and attend to it.
|
|
||||||
</p>
|
|
||||||
<p>The solution is to use the right techniques to tell ffmpeg not to consult
|
|
||||||
console input. You can use the
|
|
||||||
<a class="url" href="ffmpeg.html#stdin-option"><code class="code">-nostdin</code> option</a>,
|
|
||||||
or redirect standard input with <code class="code">< /dev/null</code>.
|
|
||||||
See FAQ
|
|
||||||
<a class="ref" href="#background-task"><em class="emph">How do I run ffmpeg as a background task?</em></a>
|
|
||||||
for details.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Development">
|
|
||||||
<h2 class="chapter">4 Development</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Are-there-examples-illustrating-how-to-use-the-FFmpeg-libraries_002c-particularly-libavcodec-and-libavformat_003f" accesskey="1">Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?</a></li>
|
|
||||||
<li><a href="#Can-you-support-my-C-compiler-XXX_003f" accesskey="2">Can you support my C compiler XXX?</a></li>
|
|
||||||
<li><a href="#Is-Microsoft-Visual-C_002b_002b-supported_003f" accesskey="3">Is Microsoft Visual C++ supported?</a></li>
|
|
||||||
<li><a href="#Can-you-add-automake_002c-libtool-or-autoconf-support_003f" accesskey="4">Can you add automake, libtool or autoconf support?</a></li>
|
|
||||||
<li><a href="#Why-not-rewrite-FFmpeg-in-object_002doriented-C_002b_002b_003f" accesskey="5">Why not rewrite FFmpeg in object-oriented C++?</a></li>
|
|
||||||
<li><a href="#Why-are-the-ffmpeg-programs-devoid-of-debugging-symbols_003f" accesskey="6">Why are the ffmpeg programs devoid of debugging symbols?</a></li>
|
|
||||||
<li><a href="#I-do-not-like-the-LGPL_002c-can-I-contribute-code-under-the-GPL-instead_003f" accesskey="7">I do not like the LGPL, can I contribute code under the GPL instead?</a></li>
|
|
||||||
<li><a href="#I_0027m-using-FFmpeg-from-within-my-C-application-but-the-linker-complains-about-missing-symbols-from-the-libraries-themselves_002e" accesskey="8">I’m using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.</a></li>
|
|
||||||
<li><a href="#I_0027m-using-FFmpeg-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e" accesskey="9">I’m using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.</a></li>
|
|
||||||
<li><a href="#I_0027m-using-libavutil-from-within-my-C_002b_002b-application-but-the-compiler-complains-about-_0027UINT64_005fC_0027-was-not-declared-in-this-scope">I’m using libavutil from within my C++ application but the compiler complains about ’UINT64_C’ was not declared in this scope</a></li>
|
|
||||||
<li><a href="#I-have-a-file-in-memory-_002f-a-API-different-from-_002aopen_002f_002aread_002f-libc-how-do-I-use-it-with-libavformat_003f">I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?</a></li>
|
|
||||||
<li><a href="#Where-is-the-documentation-about-ffv1_002c-msmpeg4_002c-asv1_002c-4xm_003f">Where is the documentation about ffv1, msmpeg4, asv1, 4xm?</a></li>
|
|
||||||
<li><a href="#How-do-I-feed-H_002e263_002dRTP-_0028and-other-codecs-in-RTP_0029-to-libavcodec_003f">How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?</a></li>
|
|
||||||
<li><a href="#AVStream_002er_005fframe_005frate-is-wrong_002c-it-is-much-larger-than-the-frame-rate_002e">AVStream.r_frame_rate is wrong, it is much larger than the frame rate.</a></li>
|
|
||||||
<li><a href="#Why-is-make-fate-not-running-all-tests_003f">Why is <code class="code">make fate</code> not running all tests?</a></li>
|
|
||||||
<li><a href="#Why-is-make-fate-not-finding-the-samples_003f">Why is <code class="code">make fate</code> not finding the samples?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Are-there-examples-illustrating-how-to-use-the-FFmpeg-libraries_002c-particularly-libavcodec-and-libavformat_003f">
|
|
||||||
<h3 class="section">4.1 Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?</h3>
|
|
||||||
|
|
||||||
<p>Yes. Check the <samp class="file">doc/examples</samp> directory in the source
|
|
||||||
repository, also available online at:
|
|
||||||
<a class="url" href="https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples">https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples</a>.
|
|
||||||
</p>
|
|
||||||
<p>Examples are also installed by default, usually in
|
|
||||||
<code class="code">$PREFIX/share/ffmpeg/examples</code>.
|
|
||||||
</p>
|
|
||||||
<p>Also you may read the Developers Guide of the FFmpeg documentation. Alternatively,
|
|
||||||
examine the source code for one of the many open source projects that
|
|
||||||
already incorporate FFmpeg at (<a class="url" href="projects.html">projects.html</a>).
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Can-you-support-my-C-compiler-XXX_003f">
|
|
||||||
<h3 class="section">4.2 Can you support my C compiler XXX?</h3>
|
|
||||||
|
|
||||||
<p>It depends. If your compiler is C99-compliant, then patches to support
|
|
||||||
it are likely to be welcome if they do not pollute the source code
|
|
||||||
with <code class="code">#ifdef</code>s related to the compiler.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Is-Microsoft-Visual-C_002b_002b-supported_003f">
|
|
||||||
<h3 class="section">4.3 Is Microsoft Visual C++ supported?</h3>
|
|
||||||
|
|
||||||
<p>Yes. Please see the <a class="uref" href="platform.html">Microsoft Visual C++</a>
|
|
||||||
section in the FFmpeg documentation.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Can-you-add-automake_002c-libtool-or-autoconf-support_003f">
|
|
||||||
<h3 class="section">4.4 Can you add automake, libtool or autoconf support?</h3>
|
|
||||||
|
|
||||||
<p>No. These tools are too bloated and they complicate the build.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-not-rewrite-FFmpeg-in-object_002doriented-C_002b_002b_003f">
|
|
||||||
<h3 class="section">4.5 Why not rewrite FFmpeg in object-oriented C++?</h3>
|
|
||||||
|
|
||||||
<p>FFmpeg is already organized in a highly modular manner and does not need to
|
|
||||||
be rewritten in a formal object language. Further, many of the developers
|
|
||||||
favor straight C; it works for them. For more arguments on this matter,
|
|
||||||
read <a class="uref" href="https://web.archive.org/web/20111004021423/http://kernel.org/pub/linux/docs/lkml/#s15">"Programming Religion"</a>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-are-the-ffmpeg-programs-devoid-of-debugging-symbols_003f">
|
|
||||||
<h3 class="section">4.6 Why are the ffmpeg programs devoid of debugging symbols?</h3>
|
|
||||||
|
|
||||||
<p>The build process creates <code class="command">ffmpeg_g</code>, <code class="command">ffplay_g</code>, etc. which
|
|
||||||
contain full debug information. Those binaries are stripped to create
|
|
||||||
<code class="command">ffmpeg</code>, <code class="command">ffplay</code>, etc. If you need the debug information, use
|
|
||||||
the *_g versions.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="I-do-not-like-the-LGPL_002c-can-I-contribute-code-under-the-GPL-instead_003f">
|
|
||||||
<h3 class="section">4.7 I do not like the LGPL, can I contribute code under the GPL instead?</h3>
|
|
||||||
|
|
||||||
<p>Yes, as long as the code is optional and can easily and cleanly be placed
|
|
||||||
under #if CONFIG_GPL without breaking anything. So, for example, a new codec
|
|
||||||
or filter would be OK under GPL while a bug fix to LGPL code would not.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="I_0027m-using-FFmpeg-from-within-my-C-application-but-the-linker-complains-about-missing-symbols-from-the-libraries-themselves_002e">
|
|
||||||
<h3 class="section">4.8 I’m using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.</h3>
|
|
||||||
|
|
||||||
<p>FFmpeg builds static libraries by default. In static libraries, dependencies
|
|
||||||
are not handled. That has two consequences. First, you must specify the
|
|
||||||
libraries in dependency order: <code class="code">-lavdevice</code> must come before
|
|
||||||
<code class="code">-lavformat</code>, <code class="code">-lavutil</code> must come after everything else, etc.
|
|
||||||
Second, external libraries that are used in FFmpeg have to be specified too.
|
|
||||||
</p>
|
|
||||||
<p>An easy way to get the full list of required libraries in dependency order
|
|
||||||
is to use <code class="code">pkg-config</code>.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>See <samp class="file">doc/example/Makefile</samp> and <samp class="file">doc/example/pc-uninstalled</samp> for
|
|
||||||
more details.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="I_0027m-using-FFmpeg-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e">
|
|
||||||
<h3 class="section">4.9 I’m using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.</h3>
|
|
||||||
|
|
||||||
<p>FFmpeg is a pure C project, so to use the libraries within your C++ application
|
|
||||||
you need to explicitly state that you are using a C library. You can do this by
|
|
||||||
encompassing your FFmpeg includes using <code class="code">extern "C"</code>.
|
|
||||||
</p>
|
|
||||||
<p>See <a class="url" href="http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3">http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="I_0027m-using-libavutil-from-within-my-C_002b_002b-application-but-the-compiler-complains-about-_0027UINT64_005fC_0027-was-not-declared-in-this-scope">
|
|
||||||
<h3 class="section">4.10 I’m using libavutil from within my C++ application but the compiler complains about ’UINT64_C’ was not declared in this scope</h3>
|
|
||||||
|
|
||||||
<p>FFmpeg is a pure C project using C99 math features, in order to enable C++
|
|
||||||
to use them you have to append -D__STDC_CONSTANT_MACROS to your CXXFLAGS
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="I-have-a-file-in-memory-_002f-a-API-different-from-_002aopen_002f_002aread_002f-libc-how-do-I-use-it-with-libavformat_003f">
|
|
||||||
<h3 class="section">4.11 I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?</h3>
|
|
||||||
|
|
||||||
<p>You have to create a custom AVIOContext using <code class="code">avio_alloc_context</code>,
|
|
||||||
see <samp class="file">libavformat/aviobuf.c</samp> in FFmpeg and <samp class="file">libmpdemux/demux_lavf.c</samp> in MPlayer or MPlayer2 sources.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Where-is-the-documentation-about-ffv1_002c-msmpeg4_002c-asv1_002c-4xm_003f">
|
|
||||||
<h3 class="section">4.12 Where is the documentation about ffv1, msmpeg4, asv1, 4xm?</h3>
|
|
||||||
|
|
||||||
<p>see <a class="url" href="https://www.ffmpeg.org/~michael/">https://www.ffmpeg.org/~michael/</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-feed-H_002e263_002dRTP-_0028and-other-codecs-in-RTP_0029-to-libavcodec_003f">
|
|
||||||
<h3 class="section">4.13 How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?</h3>
|
|
||||||
|
|
||||||
<p>Even if peculiar since it is network oriented, RTP is a container like any
|
|
||||||
other. You have to <em class="emph">demux</em> RTP before feeding the payload to libavcodec.
|
|
||||||
In this specific case please look at RFC 4629 to see how it should be done.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="AVStream_002er_005fframe_005frate-is-wrong_002c-it-is-much-larger-than-the-frame-rate_002e">
|
|
||||||
<h3 class="section">4.14 AVStream.r_frame_rate is wrong, it is much larger than the frame rate.</h3>
|
|
||||||
|
|
||||||
<p><code class="code">r_frame_rate</code> is NOT the average frame rate, it is the smallest frame rate
|
|
||||||
that can accurately represent all timestamps. So no, it is not
|
|
||||||
wrong if it is larger than the average!
|
|
||||||
For example, if you have mixed 25 and 30 fps content, then <code class="code">r_frame_rate</code>
|
|
||||||
will be 150 (it is the least common multiple).
|
|
||||||
If you are looking for the average frame rate, see <code class="code">AVStream.avg_frame_rate</code>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-is-make-fate-not-running-all-tests_003f">
|
|
||||||
<h3 class="section">4.15 Why is <code class="code">make fate</code> not running all tests?</h3>
|
|
||||||
|
|
||||||
<p>Make sure you have the fate-suite samples and the <code class="code">SAMPLES</code> Make variable
|
|
||||||
or <code class="code">FATE_SAMPLES</code> environment variable or the <code class="code">--samples</code>
|
|
||||||
<code class="command">configure</code> option is set to the right path.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-is-make-fate-not-finding-the-samples_003f">
|
|
||||||
<h3 class="section">4.16 Why is <code class="code">make fate</code> not finding the samples?</h3>
|
|
||||||
|
|
||||||
<p>Do you happen to have a <code class="code">~</code> character in the samples path to indicate a
|
|
||||||
home directory? The value is used in ways where the shell cannot expand it,
|
|
||||||
causing FATE to not find files. Just replace <code class="code">~</code> by the full path.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,375 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>FFmpeg Automated Testing Environment</title>
|
|
||||||
|
|
||||||
<meta name="description" content="FFmpeg Automated Testing Environment">
|
|
||||||
<meta name="keywords" content="FFmpeg Automated Testing Environment">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#Top" rel="start" title="Top">
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
div.example {margin-left: 3.2em}
|
|
||||||
ul.mark-bullet {list-style-type: disc}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="Top">
|
|
||||||
<a class="top" id="SEC_Top"></a>
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Introduction" href="#Introduction">1 Introduction</a></li>
|
|
||||||
<li><a id="toc-Using-FATE-from-your-FFmpeg-source-directory" href="#Using-FATE-from-your-FFmpeg-source-directory">2 Using FATE from your FFmpeg source directory</a></li>
|
|
||||||
<li><a id="toc-Submitting-the-results-to-the-FFmpeg-result-aggregation-server" href="#Submitting-the-results-to-the-FFmpeg-result-aggregation-server">3 Submitting the results to the FFmpeg result aggregation server</a></li>
|
|
||||||
<li><a id="toc-Uploading-new-samples-to-the-fate-suite" href="#Uploading-new-samples-to-the-fate-suite">4 Uploading new samples to the fate suite</a></li>
|
|
||||||
<li><a id="toc-FATE-makefile-targets-and-variables" href="#FATE-makefile-targets-and-variables">5 FATE makefile targets and variables</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Makefile-targets" href="#Makefile-targets">5.1 Makefile targets</a></li>
|
|
||||||
<li><a id="toc-Makefile-variables" href="#Makefile-variables">5.2 Makefile variables</a></li>
|
|
||||||
<li><a id="toc-Examples" href="#Examples">5.3 Examples</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Introduction">
|
|
||||||
<h2 class="chapter">1 Introduction</h2>
|
|
||||||
|
|
||||||
<p>FATE is an extended regression suite on the client-side and a means
|
|
||||||
for results aggregation and presentation on the server-side.
|
|
||||||
</p>
|
|
||||||
<p>The first part of this document explains how you can use FATE from
|
|
||||||
your FFmpeg source directory to test your ffmpeg binary. The second
|
|
||||||
part describes how you can run FATE to submit the results to FFmpeg’s
|
|
||||||
FATE server.
|
|
||||||
</p>
|
|
||||||
<p>In any way you can have a look at the publicly viewable FATE results
|
|
||||||
by visiting this website:
|
|
||||||
</p>
|
|
||||||
<p><a class="url" href="http://fate.ffmpeg.org/">http://fate.ffmpeg.org/</a>
|
|
||||||
</p>
|
|
||||||
<p>This is especially recommended for all people contributing source
|
|
||||||
code to FFmpeg, as it can be seen if some test on some platform broke
|
|
||||||
with their recent contribution. This usually happens on the platforms
|
|
||||||
the developers could not test on.
|
|
||||||
</p>
|
|
||||||
<p>The second part of this document describes how you can run FATE to
|
|
||||||
submit your results to FFmpeg’s FATE server. If you want to submit your
|
|
||||||
results be sure to check that your combination of CPU, OS and compiler
|
|
||||||
is not already listed on the above mentioned website.
|
|
||||||
</p>
|
|
||||||
<p>In the third part you can find a comprehensive listing of FATE makefile
|
|
||||||
targets and variables.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Using-FATE-from-your-FFmpeg-source-directory">
|
|
||||||
<h2 class="chapter">2 Using FATE from your FFmpeg source directory</h2>
|
|
||||||
|
|
||||||
<p>If you want to run FATE on your machine you need to have the samples
|
|
||||||
in place. You can get the samples via the build target fate-rsync.
|
|
||||||
Use this command from the top-level source directory:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">make fate-rsync SAMPLES=fate-suite/
|
|
||||||
make fate SAMPLES=fate-suite/
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>The above commands set the samples location by passing a makefile
|
|
||||||
variable via command line. It is also possible to set the samples
|
|
||||||
location at source configuration time by invoking configure with
|
|
||||||
<samp class="option">--samples=<path to the samples directory></samp>. Afterwards you can
|
|
||||||
invoke the makefile targets without setting the <var class="var">SAMPLES</var> makefile
|
|
||||||
variable. This is illustrated by the following commands:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">./configure --samples=fate-suite/
|
|
||||||
make fate-rsync
|
|
||||||
make fate
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Yet another way to tell FATE about the location of the sample
|
|
||||||
directory is by making sure the environment variable FATE_SAMPLES
|
|
||||||
contains the path to your samples directory. This can be achieved
|
|
||||||
by e.g. putting that variable in your shell profile or by setting
|
|
||||||
it in your interactive session.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">FATE_SAMPLES=fate-suite/ make fate
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<div class="float">
|
|
||||||
<p>Do not put a ’~’ character in the samples path to indicate a home
|
|
||||||
directory. Because of shell nuances, this will cause FATE to fail.
|
|
||||||
</p><div class="type-number-float"><p><strong class="strong">NOTE
|
|
||||||
</strong></p></div></div>
|
|
||||||
<p>To get the complete list of tests, run the command:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">make fate-list
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>You can specify a subset of tests to run by specifying the
|
|
||||||
corresponding elements from the list with the <code class="code">fate-</code> prefix,
|
|
||||||
e.g. as in:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">make fate-ffprobe_compact fate-ffprobe_xml
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>This makes it easier to run a few tests in case of failure without
|
|
||||||
running the complete test suite.
|
|
||||||
</p>
|
|
||||||
<p>To use a custom wrapper to run the test, pass <samp class="option">--target-exec</samp> to
|
|
||||||
<code class="command">configure</code> or set the <var class="var">TARGET_EXEC</var> Make variable.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Submitting-the-results-to-the-FFmpeg-result-aggregation-server">
|
|
||||||
<h2 class="chapter">3 Submitting the results to the FFmpeg result aggregation server</h2>
|
|
||||||
|
|
||||||
<p>To submit your results to the server you should run fate through the
|
|
||||||
shell script <samp class="file">tests/fate.sh</samp> from the FFmpeg sources. This script needs
|
|
||||||
to be invoked with a configuration file as its first argument.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">tests/fate.sh /path/to/fate_config
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>A configuration file template with comments describing the individual
|
|
||||||
configuration variables can be found at <samp class="file">doc/fate_config.sh.template</samp>.
|
|
||||||
</p>
|
|
||||||
<p>The mentioned configuration template is also available here:
|
|
||||||
</p><pre class="verbatim">slot= # some unique identifier
|
|
||||||
repo=git://source.ffmpeg.org/ffmpeg.git # the source repository
|
|
||||||
#branch=release/2.6 # the branch to test
|
|
||||||
samples= # path to samples directory
|
|
||||||
workdir= # directory in which to do all the work
|
|
||||||
#fate_recv="ssh -T fate@fate.ffmpeg.org" # command to submit report
|
|
||||||
comment= # optional description
|
|
||||||
build_only= # set to "yes" for a compile-only instance that skips tests
|
|
||||||
ignore_tests=
|
|
||||||
|
|
||||||
# the following are optional and map to configure options
|
|
||||||
arch=
|
|
||||||
cpu=
|
|
||||||
cross_prefix=
|
|
||||||
as=
|
|
||||||
cc=
|
|
||||||
ld=
|
|
||||||
target_os=
|
|
||||||
sysroot=
|
|
||||||
target_exec=
|
|
||||||
target_path=
|
|
||||||
target_samples=
|
|
||||||
extra_cflags=
|
|
||||||
extra_ldflags=
|
|
||||||
extra_libs=
|
|
||||||
extra_conf= # extra configure options not covered above
|
|
||||||
|
|
||||||
#make= # name of GNU make if not 'make'
|
|
||||||
makeopts= # extra options passed to 'make'
|
|
||||||
#makeopts_fate= # extra options passed to 'make' when running tests,
|
|
||||||
# defaulting to makeopts above if this is not set
|
|
||||||
#tar= # command to create a tar archive from its arguments on stdout,
|
|
||||||
# defaults to 'tar c'
|
|
||||||
</pre>
|
|
||||||
<p>Create a configuration that suits your needs, based on the configuration
|
|
||||||
template. The <code class="env">slot</code> configuration variable can be any string that is not
|
|
||||||
yet used, but it is suggested that you name it adhering to the following
|
|
||||||
pattern ‘<samp class="samp"><var class="var">arch</var>-<var class="var">os</var>-<var class="var">compiler</var>-<var class="var">compiler version</var></samp>’. The
|
|
||||||
configuration file itself will be sourced in a shell script, therefore all
|
|
||||||
shell features may be used. This enables you to setup the environment as you
|
|
||||||
need it for your build.
|
|
||||||
</p>
|
|
||||||
<p>For your first test runs the <code class="env">fate_recv</code> variable should be empty or
|
|
||||||
commented out. This will run everything as normal except that it will omit
|
|
||||||
the submission of the results to the server. The following files should be
|
|
||||||
present in $workdir as specified in the configuration file:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>configure.log
|
|
||||||
</li><li>compile.log
|
|
||||||
</li><li>test.log
|
|
||||||
</li><li>report
|
|
||||||
</li><li>version
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<p>When you have everything working properly you can create an SSH key pair
|
|
||||||
and send the public key to the FATE server administrator who can be contacted
|
|
||||||
at the email address <a class="email" href="mailto:fate-admin@ffmpeg.org">fate-admin@ffmpeg.org</a>.
|
|
||||||
</p>
|
|
||||||
<p>Configure your SSH client to use public key authentication with that key
|
|
||||||
when connecting to the FATE server. Also do not forget to check the identity
|
|
||||||
of the server and to accept its host key. This can usually be achieved by
|
|
||||||
running your SSH client manually and killing it after you accepted the key.
|
|
||||||
The FATE server’s fingerprint is:
|
|
||||||
</p>
|
|
||||||
<dl class="table">
|
|
||||||
<dt>‘<samp class="samp">RSA</samp>’</dt>
|
|
||||||
<dd><p>d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">ECDSA</samp>’</dt>
|
|
||||||
<dd><p>76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>If you have problems connecting to the FATE server, it may help to try out
|
|
||||||
the <code class="command">ssh</code> command with one or more <samp class="option">-v</samp> options. You should
|
|
||||||
get detailed output concerning your SSH configuration and the authentication
|
|
||||||
process.
|
|
||||||
</p>
|
|
||||||
<p>The only thing left is to automate the execution of the fate.sh script and
|
|
||||||
the synchronisation of the samples directory.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Uploading-new-samples-to-the-fate-suite">
|
|
||||||
<h2 class="chapter">4 Uploading new samples to the fate suite</h2>
|
|
||||||
|
|
||||||
<p>If you need a sample uploaded send a mail to samples-request.
|
|
||||||
</p>
|
|
||||||
<p>This is for developers who have an account on the fate suite server.
|
|
||||||
If you upload new samples, please make sure they are as small as possible,
|
|
||||||
space on each client, network bandwidth and so on benefit from smaller test cases.
|
|
||||||
Also keep in mind older checkouts use existing sample files, that means in
|
|
||||||
practice generally do not replace, remove or overwrite files as it likely would
|
|
||||||
break older checkouts or releases.
|
|
||||||
Also all needed samples for a commit should be uploaded, ideally 24
|
|
||||||
hours, before the push.
|
|
||||||
If you need an account for frequently uploading samples or you wish to help
|
|
||||||
others by doing that send a mail to ffmpeg-devel.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">#First update your local samples copy:
|
|
||||||
rsync -vauL --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X fate-suite.ffmpeg.org:/home/samples/fate-suite/ ~/fate-suite
|
|
||||||
|
|
||||||
#Then do a dry run checking what would be uploaded:
|
|
||||||
rsync -vanL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
|
|
||||||
|
|
||||||
#Upload the files:
|
|
||||||
rsync -vaL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="FATE-makefile-targets-and-variables">
|
|
||||||
<h2 class="chapter">5 FATE makefile targets and variables</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Makefile-targets" accesskey="1">Makefile targets</a></li>
|
|
||||||
<li><a href="#Makefile-variables" accesskey="2">Makefile variables</a></li>
|
|
||||||
<li><a href="#Examples" accesskey="3">Examples</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Makefile-targets">
|
|
||||||
<h3 class="section">5.1 Makefile targets</h3>
|
|
||||||
|
|
||||||
<dl class="table">
|
|
||||||
<dt><samp class="option">fate-rsync</samp></dt>
|
|
||||||
<dd><p>Download/synchronize sample files to the configured samples directory.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">fate-list</samp></dt>
|
|
||||||
<dd><p>Will list all fate/regression test targets.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">fate</samp></dt>
|
|
||||||
<dd><p>Run the FATE test suite (requires the fate-suite dataset).
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Makefile-variables">
|
|
||||||
<h3 class="section">5.2 Makefile variables</h3>
|
|
||||||
|
|
||||||
<dl class="table">
|
|
||||||
<dt><code class="env">V</code></dt>
|
|
||||||
<dd><p>Verbosity level, can be set to 0, 1 or 2.
|
|
||||||
</p><ul class="itemize mark-bullet">
|
|
||||||
<li>0: show just the test arguments
|
|
||||||
</li><li>1: show just the command used in the test
|
|
||||||
</li><li>2: show everything
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><code class="env">SAMPLES</code></dt>
|
|
||||||
<dd><p>Specify or override the path to the FATE samples at make time, it has a
|
|
||||||
meaning only while running the regression tests.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><code class="env">THREADS</code></dt>
|
|
||||||
<dd><p>Specify how many threads to use while running regression tests, it is
|
|
||||||
quite useful to detect thread-related regressions.
|
|
||||||
</p>
|
|
||||||
<p>This variable may be set to the string "random", optionally followed by a
|
|
||||||
number, like "random99", This will cause each test to use a random number of
|
|
||||||
threads. If a number is specified, it is used as a maximum number of threads,
|
|
||||||
otherwise 16 is the maximum.
|
|
||||||
</p>
|
|
||||||
<p>In case a test fails, the thread count used for it will be written into the
|
|
||||||
errfile.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><code class="env">THREAD_TYPE</code></dt>
|
|
||||||
<dd><p>Specify which threading strategy test, either ‘<samp class="samp">slice</samp>’ or ‘<samp class="samp">frame</samp>’,
|
|
||||||
by default ‘<samp class="samp">slice+frame</samp>’
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><code class="env">CPUFLAGS</code></dt>
|
|
||||||
<dd><p>Specify CPU flags.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><code class="env">TARGET_EXEC</code></dt>
|
|
||||||
<dd><p>Specify or override the wrapper used to run the tests.
|
|
||||||
The <code class="env">TARGET_EXEC</code> option provides a way to run FATE wrapped in
|
|
||||||
<code class="command">valgrind</code>, <code class="command">qemu-user</code> or <code class="command">wine</code> or on remote targets
|
|
||||||
through <code class="command">ssh</code>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><code class="env">GEN</code></dt>
|
|
||||||
<dd><p>Set to ‘<samp class="samp">1</samp>’ to generate the missing or mismatched references.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><code class="env">HWACCEL</code></dt>
|
|
||||||
<dd><p>Specify which hardware acceleration to use while running regression tests,
|
|
||||||
by default ‘<samp class="samp">none</samp>’ is used.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><code class="env">KEEP</code></dt>
|
|
||||||
<dd><p>Set to ‘<samp class="samp">1</samp>’ to keep temp files generated by fate test(s) when test is successful.
|
|
||||||
Default is ‘<samp class="samp">0</samp>’, which removes these files. Files are always kept when a test
|
|
||||||
fails.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Examples">
|
|
||||||
<h3 class="section">5.3 Examples</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,362 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>FFmpeg Resampler Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="FFmpeg Resampler Documentation">
|
|
||||||
<meta name="keywords" content="FFmpeg Resampler Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-Resampler-Options" href="#Resampler-Options">2 Resampler Options</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">3 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">4 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg resampler provides a high-level interface to the
|
|
||||||
libswresample library audio resampling utilities. In particular it
|
|
||||||
allows one to perform audio resampling, audio channel layout rematrixing,
|
|
||||||
and convert audio format and packing layout.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Resampler-Options">
|
|
||||||
<h2 class="chapter">2 Resampler Options</h2>
|
|
||||||
|
|
||||||
<p>The audio resampler supports the following named options.
|
|
||||||
</p>
|
|
||||||
<p>Options may be set by specifying -<var class="var">option</var> <var class="var">value</var> in the
|
|
||||||
FFmpeg tools, <var class="var">option</var>=<var class="var">value</var> for the aresample filter,
|
|
||||||
by setting the value explicitly in the
|
|
||||||
<code class="code">SwrContext</code> options or using the <samp class="file">libavutil/opt.h</samp> API for
|
|
||||||
programmatic use.
|
|
||||||
</p>
|
|
||||||
<dl class="table">
|
|
||||||
<dt><samp class="option">uchl, used_chlayout</samp></dt>
|
|
||||||
<dd><p>Set used input channel layout. Default is unset. This option is
|
|
||||||
only used for special remapping.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">isr, in_sample_rate</samp></dt>
|
|
||||||
<dd><p>Set the input sample rate. Default value is 0.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">osr, out_sample_rate</samp></dt>
|
|
||||||
<dd><p>Set the output sample rate. Default value is 0.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">isf, in_sample_fmt</samp></dt>
|
|
||||||
<dd><p>Specify the input sample format. It is set by default to <code class="code">none</code>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">osf, out_sample_fmt</samp></dt>
|
|
||||||
<dd><p>Specify the output sample format. It is set by default to <code class="code">none</code>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">tsf, internal_sample_fmt</samp></dt>
|
|
||||||
<dd><p>Set the internal sample format. Default value is <code class="code">none</code>.
|
|
||||||
This will automatically be chosen when it is not explicitly set.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">ichl, in_chlayout</samp></dt>
|
|
||||||
<dt><samp class="option">ochl, out_chlayout</samp></dt>
|
|
||||||
<dd><p>Set the input/output channel layout.
|
|
||||||
</p>
|
|
||||||
<p>See <a data-manual="ffmpeg-utils" href="ffmpeg-utils.html#channel-layout-syntax">(ffmpeg-utils)the Channel Layout section in the ffmpeg-utils(1) manual</a>
|
|
||||||
for the required syntax.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">clev, center_mix_level</samp></dt>
|
|
||||||
<dd><p>Set the center mix level. It is a value expressed in deciBel, and must be
|
|
||||||
in the interval [-32,32].
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">slev, surround_mix_level</samp></dt>
|
|
||||||
<dd><p>Set the surround mix level. It is a value expressed in deciBel, and must
|
|
||||||
be in the interval [-32,32].
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">lfe_mix_level</samp></dt>
|
|
||||||
<dd><p>Set LFE mix into non LFE level. It is used when there is a LFE input but no
|
|
||||||
LFE output. It is a value expressed in deciBel, and must
|
|
||||||
be in the interval [-32,32].
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">rmvol, rematrix_volume</samp></dt>
|
|
||||||
<dd><p>Set rematrix volume. Default value is 1.0.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">rematrix_maxval</samp></dt>
|
|
||||||
<dd><p>Set maximum output value for rematrixing.
|
|
||||||
This can be used to prevent clipping vs. preventing volume reduction.
|
|
||||||
A value of 1.0 prevents clipping.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">flags, swr_flags</samp></dt>
|
|
||||||
<dd><p>Set flags used by the converter. Default value is 0.
|
|
||||||
</p>
|
|
||||||
<p>It supports the following individual flags:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt><samp class="option">res</samp></dt>
|
|
||||||
<dd><p>force resampling, this flag forces resampling to be used even when the
|
|
||||||
input and output sample rates match.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">dither_scale</samp></dt>
|
|
||||||
<dd><p>Set the dither scale. Default value is 1.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">dither_method</samp></dt>
|
|
||||||
<dd><p>Set dither method. Default value is 0.
|
|
||||||
</p>
|
|
||||||
<p>Supported values:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">rectangular</samp>’</dt>
|
|
||||||
<dd><p>select rectangular dither
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">triangular</samp>’</dt>
|
|
||||||
<dd><p>select triangular dither
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">triangular_hp</samp>’</dt>
|
|
||||||
<dd><p>select triangular dither with high pass
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">lipshitz</samp>’</dt>
|
|
||||||
<dd><p>select Lipshitz noise shaping dither.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">shibata</samp>’</dt>
|
|
||||||
<dd><p>select Shibata noise shaping dither.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">low_shibata</samp>’</dt>
|
|
||||||
<dd><p>select low Shibata noise shaping dither.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">high_shibata</samp>’</dt>
|
|
||||||
<dd><p>select high Shibata noise shaping dither.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">f_weighted</samp>’</dt>
|
|
||||||
<dd><p>select f-weighted noise shaping dither
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">modified_e_weighted</samp>’</dt>
|
|
||||||
<dd><p>select modified-e-weighted noise shaping dither
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">improved_e_weighted</samp>’</dt>
|
|
||||||
<dd><p>select improved-e-weighted noise shaping dither
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">resampler</samp></dt>
|
|
||||||
<dd><p>Set resampling engine. Default value is swr.
|
|
||||||
</p>
|
|
||||||
<p>Supported values:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">swr</samp>’</dt>
|
|
||||||
<dd><p>select the native SW Resampler; filter options precision and cheby are not
|
|
||||||
applicable in this case.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">soxr</samp>’</dt>
|
|
||||||
<dd><p>select the SoX Resampler (where available); compensation, and filter options
|
|
||||||
filter_size, phase_shift, exact_rational, filter_type & kaiser_beta, are not
|
|
||||||
applicable in this case.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">filter_size</samp></dt>
|
|
||||||
<dd><p>For swr only, set resampling filter size, default value is 32.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">phase_shift</samp></dt>
|
|
||||||
<dd><p>For swr only, set resampling phase shift, default value is 10, and must be in
|
|
||||||
the interval [0,30].
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">linear_interp</samp></dt>
|
|
||||||
<dd><p>Use linear interpolation when enabled (the default). Disable it if you want
|
|
||||||
to preserve speed instead of quality when exact_rational fails.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">exact_rational</samp></dt>
|
|
||||||
<dd><p>For swr only, when enabled, try to use exact phase_count based on input and
|
|
||||||
output sample rate. However, if it is larger than <code class="code">1 << phase_shift</code>,
|
|
||||||
the phase_count will be <code class="code">1 << phase_shift</code> as fallback. Default is enabled.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">cutoff</samp></dt>
|
|
||||||
<dd><p>Set cutoff frequency (swr: 6dB point; soxr: 0dB point) ratio; must be a float
|
|
||||||
value between 0 and 1. Default value is 0.97 with swr, and 0.91 with soxr
|
|
||||||
(which, with a sample-rate of 44100, preserves the entire audio band to 20kHz).
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">precision</samp></dt>
|
|
||||||
<dd><p>For soxr only, the precision in bits to which the resampled signal will be
|
|
||||||
calculated. The default value of 20 (which, with suitable dithering, is
|
|
||||||
appropriate for a destination bit-depth of 16) gives SoX’s ’High Quality’; a
|
|
||||||
value of 28 gives SoX’s ’Very High Quality’.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">cheby</samp></dt>
|
|
||||||
<dd><p>For soxr only, selects passband rolloff none (Chebyshev) & higher-precision
|
|
||||||
approximation for ’irrational’ ratios. Default value is 0.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">async</samp></dt>
|
|
||||||
<dd><p>For swr only, simple 1 parameter audio sync to timestamps using stretching,
|
|
||||||
squeezing, filling and trimming. Setting this to 1 will enable filling and
|
|
||||||
trimming, larger values represent the maximum amount in samples that the data
|
|
||||||
may be stretched or squeezed for each second.
|
|
||||||
Default value is 0, thus no compensation is applied to make the samples match
|
|
||||||
the audio timestamps.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">first_pts</samp></dt>
|
|
||||||
<dd><p>For swr only, assume the first pts should be this value. The time unit is 1 / sample rate.
|
|
||||||
This allows for padding/trimming at the start of stream. By default, no
|
|
||||||
assumption is made about the first frame’s expected pts, so no padding or
|
|
||||||
trimming is done. For example, this could be set to 0 to pad the beginning with
|
|
||||||
silence if an audio stream starts after the video stream or to trim any samples
|
|
||||||
with a negative pts due to encoder delay.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">min_comp</samp></dt>
|
|
||||||
<dd><p>For swr only, set the minimum difference between timestamps and audio data (in
|
|
||||||
seconds) to trigger stretching/squeezing/filling or trimming of the
|
|
||||||
data to make it match the timestamps. The default is that
|
|
||||||
stretching/squeezing/filling and trimming is disabled
|
|
||||||
(<samp class="option">min_comp</samp> = <code class="code">FLT_MAX</code>).
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">min_hard_comp</samp></dt>
|
|
||||||
<dd><p>For swr only, set the minimum difference between timestamps and audio data (in
|
|
||||||
seconds) to trigger adding/dropping samples to make it match the
|
|
||||||
timestamps. This option effectively is a threshold to select between
|
|
||||||
hard (trim/fill) and soft (squeeze/stretch) compensation. Note that
|
|
||||||
all compensation is by default disabled through <samp class="option">min_comp</samp>.
|
|
||||||
The default is 0.1.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">comp_duration</samp></dt>
|
|
||||||
<dd><p>For swr only, set duration (in seconds) over which data is stretched/squeezed
|
|
||||||
to make it match the timestamps. Must be a non-negative double float value,
|
|
||||||
default value is 1.0.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">max_soft_comp</samp></dt>
|
|
||||||
<dd><p>For swr only, set maximum factor by which data is stretched/squeezed to make it
|
|
||||||
match the timestamps. Must be a non-negative double float value, default value
|
|
||||||
is 0.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">matrix_encoding</samp></dt>
|
|
||||||
<dd><p>Select matrixed stereo encoding.
|
|
||||||
</p>
|
|
||||||
<p>It accepts the following values:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">none</samp>’</dt>
|
|
||||||
<dd><p>select none
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">dolby</samp>’</dt>
|
|
||||||
<dd><p>select Dolby
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">dplii</samp>’</dt>
|
|
||||||
<dd><p>select Dolby Pro Logic II
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>Default value is <code class="code">none</code>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">filter_type</samp></dt>
|
|
||||||
<dd><p>For swr only, select resampling filter type. This only affects resampling
|
|
||||||
operations.
|
|
||||||
</p>
|
|
||||||
<p>It accepts the following values:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">cubic</samp>’</dt>
|
|
||||||
<dd><p>select cubic
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">blackman_nuttall</samp>’</dt>
|
|
||||||
<dd><p>select Blackman Nuttall windowed sinc
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">kaiser</samp>’</dt>
|
|
||||||
<dd><p>select Kaiser windowed sinc
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">kaiser_beta</samp></dt>
|
|
||||||
<dd><p>For swr only, set Kaiser window beta value. Must be a double float value in the
|
|
||||||
interval [2,16], default value is 9.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">output_sample_bits</samp></dt>
|
|
||||||
<dd><p>For swr only, set number of used output sample bits for dithering. Must be an integer in the
|
|
||||||
interval [0,64], default value is 0, which means it’s not used.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">3 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="libswresample.html">libswresample</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">4 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,266 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>FFmpeg Scaler Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="FFmpeg Scaler Documentation">
|
|
||||||
<meta name="keywords" content="FFmpeg Scaler Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-Scaler-Options" href="#Scaler-Options">2 Scaler Options</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">3 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">4 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg rescaler provides a high-level interface to the libswscale
|
|
||||||
library image conversion utilities. In particular it allows one to perform
|
|
||||||
image rescaling and pixel format conversion.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<a class="anchor" id="scaler_005foptions"></a></div>
|
|
||||||
<div class="chapter-level-extent" id="Scaler-Options">
|
|
||||||
<h2 class="chapter">2 Scaler Options</h2>
|
|
||||||
|
|
||||||
<p>The video scaler supports the following named options.
|
|
||||||
</p>
|
|
||||||
<p>Options may be set by specifying -<var class="var">option</var> <var class="var">value</var> in the
|
|
||||||
FFmpeg tools, with a few API-only exceptions noted below.
|
|
||||||
For programmatic use, they can be set explicitly in the
|
|
||||||
<code class="code">SwsContext</code> options or through the <samp class="file">libavutil/opt.h</samp> API.
|
|
||||||
</p>
|
|
||||||
<dl class="table">
|
|
||||||
<dd>
|
|
||||||
<a class="anchor" id="sws_005fflags"></a></dd>
|
|
||||||
<dt><samp class="option">sws_flags</samp></dt>
|
|
||||||
<dd><p>Set the scaler flags. This is also used to set the scaling
|
|
||||||
algorithm. Only a single algorithm should be selected. Default
|
|
||||||
value is ‘<samp class="samp">bicubic</samp>’.
|
|
||||||
</p>
|
|
||||||
<p>It accepts the following values:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">fast_bilinear</samp>’</dt>
|
|
||||||
<dd><p>Select fast bilinear scaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">bilinear</samp>’</dt>
|
|
||||||
<dd><p>Select bilinear scaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">bicubic</samp>’</dt>
|
|
||||||
<dd><p>Select bicubic scaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">experimental</samp>’</dt>
|
|
||||||
<dd><p>Select experimental scaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">neighbor</samp>’</dt>
|
|
||||||
<dd><p>Select nearest neighbor rescaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">area</samp>’</dt>
|
|
||||||
<dd><p>Select averaging area rescaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">bicublin</samp>’</dt>
|
|
||||||
<dd><p>Select bicubic scaling algorithm for the luma component, bilinear for
|
|
||||||
chroma components.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">gauss</samp>’</dt>
|
|
||||||
<dd><p>Select Gaussian rescaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">sinc</samp>’</dt>
|
|
||||||
<dd><p>Select sinc rescaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">lanczos</samp>’</dt>
|
|
||||||
<dd><p>Select Lanczos rescaling algorithm. The default width (alpha) is 3 and can be
|
|
||||||
changed by setting <code class="code">param0</code>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">spline</samp>’</dt>
|
|
||||||
<dd><p>Select natural bicubic spline rescaling algorithm.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">print_info</samp>’</dt>
|
|
||||||
<dd><p>Enable printing/debug logging.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">accurate_rnd</samp>’</dt>
|
|
||||||
<dd><p>Enable accurate rounding.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">full_chroma_int</samp>’</dt>
|
|
||||||
<dd><p>Enable full chroma interpolation.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">full_chroma_inp</samp>’</dt>
|
|
||||||
<dd><p>Select full chroma input.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">bitexact</samp>’</dt>
|
|
||||||
<dd><p>Enable bitexact output.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">srcw <var class="var">(API only)</var></samp></dt>
|
|
||||||
<dd><p>Set source width.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">srch <var class="var">(API only)</var></samp></dt>
|
|
||||||
<dd><p>Set source height.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">dstw <var class="var">(API only)</var></samp></dt>
|
|
||||||
<dd><p>Set destination width.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">dsth <var class="var">(API only)</var></samp></dt>
|
|
||||||
<dd><p>Set destination height.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">src_format <var class="var">(API only)</var></samp></dt>
|
|
||||||
<dd><p>Set source pixel format (must be expressed as an integer).
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">dst_format <var class="var">(API only)</var></samp></dt>
|
|
||||||
<dd><p>Set destination pixel format (must be expressed as an integer).
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">src_range <var class="var">(boolean)</var></samp></dt>
|
|
||||||
<dd><p>If value is set to <code class="code">1</code>, indicates source is full range. Default value is
|
|
||||||
<code class="code">0</code>, which indicates source is limited range.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">dst_range <var class="var">(boolean)</var></samp></dt>
|
|
||||||
<dd><p>If value is set to <code class="code">1</code>, enable full range for destination. Default value
|
|
||||||
is <code class="code">0</code>, which enables limited range.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="sws_005fparams"></a></dd>
|
|
||||||
<dt><samp class="option">param0, param1</samp></dt>
|
|
||||||
<dd><p>Set scaling algorithm parameters. The specified values are specific of
|
|
||||||
some scaling algorithms and ignored by others. The specified values
|
|
||||||
are floating point number values.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">sws_dither</samp></dt>
|
|
||||||
<dd><p>Set the dithering algorithm. Accepts one of the following
|
|
||||||
values. Default value is ‘<samp class="samp">auto</samp>’.
|
|
||||||
</p>
|
|
||||||
<dl class="table">
|
|
||||||
<dt>‘<samp class="samp">auto</samp>’</dt>
|
|
||||||
<dd><p>automatic choice
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">none</samp>’</dt>
|
|
||||||
<dd><p>no dithering
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">bayer</samp>’</dt>
|
|
||||||
<dd><p>bayer dither
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">ed</samp>’</dt>
|
|
||||||
<dd><p>error diffusion dither
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">a_dither</samp>’</dt>
|
|
||||||
<dd><p>arithmetic dither, based using addition
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">x_dither</samp>’</dt>
|
|
||||||
<dd><p>arithmetic dither, based using xor (more random/less apparent patterning that
|
|
||||||
a_dither).
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">alphablend</samp></dt>
|
|
||||||
<dd><p>Set the alpha blending to use when the input has alpha but the output does not.
|
|
||||||
Default value is ‘<samp class="samp">none</samp>’.
|
|
||||||
</p>
|
|
||||||
<dl class="table">
|
|
||||||
<dt>‘<samp class="samp">uniform_color</samp>’</dt>
|
|
||||||
<dd><p>Blend onto a uniform background color
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">checkerboard</samp>’</dt>
|
|
||||||
<dd><p>Blend onto a checkerboard
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">none</samp>’</dt>
|
|
||||||
<dd><p>No blending
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">3 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="libswscale.html">libswscale</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">4 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,893 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>ffplay Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="ffplay Documentation">
|
|
||||||
<meta name="keywords" content="ffplay Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
div.example {margin-left: 3.2em}
|
|
||||||
kbd.key {font-style: normal}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Synopsis" href="#Synopsis">1 Synopsis</a></li>
|
|
||||||
<li><a id="toc-Description" href="#Description">2 Description</a></li>
|
|
||||||
<li><a id="toc-Options" href="#Options">3 Options</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Stream-specifiers-1" href="#Stream-specifiers-1">3.1 Stream specifiers</a></li>
|
|
||||||
<li><a id="toc-Generic-options" href="#Generic-options">3.2 Generic options</a></li>
|
|
||||||
<li><a id="toc-AVOptions" href="#AVOptions">3.3 AVOptions</a></li>
|
|
||||||
<li><a id="toc-Main-options" href="#Main-options">3.4 Main options</a></li>
|
|
||||||
<li><a id="toc-Advanced-options" href="#Advanced-options">3.5 Advanced options</a></li>
|
|
||||||
<li><a id="toc-While-playing" href="#While-playing">3.6 While playing</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">4 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">5 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Synopsis">
|
|
||||||
<h2 class="chapter">1 Synopsis</h2>
|
|
||||||
|
|
||||||
<p>ffplay [<var class="var">options</var>] [<samp class="file">input_url</samp>]
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">2 Description</h2>
|
|
||||||
|
|
||||||
<p>FFplay is a very simple and portable media player using the FFmpeg
|
|
||||||
libraries and the SDL library. It is mostly used as a testbed for the
|
|
||||||
various FFmpeg APIs.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Options">
|
|
||||||
<h2 class="chapter">3 Options</h2>
|
|
||||||
|
|
||||||
<p>All the numerical options, if not specified otherwise, accept a string
|
|
||||||
representing a number as input, which may be followed by one of the SI
|
|
||||||
unit prefixes, for example: ’K’, ’M’, or ’G’.
|
|
||||||
</p>
|
|
||||||
<p>If ’i’ is appended to the SI unit prefix, the complete prefix will be
|
|
||||||
interpreted as a unit prefix for binary multiples, which are based on
|
|
||||||
powers of 1024 instead of powers of 1000. Appending ’B’ to the SI unit
|
|
||||||
prefix multiplies the value by 8. This allows using, for example:
|
|
||||||
’KB’, ’MiB’, ’G’ and ’B’ as number suffixes.
|
|
||||||
</p>
|
|
||||||
<p>Options which do not take arguments are boolean options, and set the
|
|
||||||
corresponding value to true. They can be set to false by prefixing
|
|
||||||
the option name with "no". For example using "-nofoo"
|
|
||||||
will set the boolean option with name "foo" to false.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="Stream-specifiers"></a><ul class="mini-toc">
|
|
||||||
<li><a href="#Stream-specifiers-1" accesskey="1">Stream specifiers</a></li>
|
|
||||||
<li><a href="#Generic-options" accesskey="2">Generic options</a></li>
|
|
||||||
<li><a href="#AVOptions" accesskey="3">AVOptions</a></li>
|
|
||||||
<li><a href="#Main-options" accesskey="4">Main options</a></li>
|
|
||||||
<li><a href="#Advanced-options" accesskey="5">Advanced options</a></li>
|
|
||||||
<li><a href="#While-playing" accesskey="6">While playing</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Stream-specifiers-1">
|
|
||||||
<h3 class="section">3.1 Stream specifiers</h3>
|
|
||||||
<p>Some options are applied per-stream, e.g. bitrate or codec. Stream specifiers
|
|
||||||
are used to precisely specify which stream(s) a given option belongs to.
|
|
||||||
</p>
|
|
||||||
<p>A stream specifier is a string generally appended to the option name and
|
|
||||||
separated from it by a colon. E.g. <code class="code">-codec:a:1 ac3</code> contains the
|
|
||||||
<code class="code">a:1</code> stream specifier, which matches the second audio stream. Therefore, it
|
|
||||||
would select the ac3 codec for the second audio stream.
|
|
||||||
</p>
|
|
||||||
<p>A stream specifier can match several streams, so that the option is applied to all
|
|
||||||
of them. E.g. the stream specifier in <code class="code">-b:a 128k</code> matches all audio
|
|
||||||
streams.
|
|
||||||
</p>
|
|
||||||
<p>An empty stream specifier matches all streams. For example, <code class="code">-codec copy</code>
|
|
||||||
or <code class="code">-codec: copy</code> would copy all the streams without reencoding.
|
|
||||||
</p>
|
|
||||||
<p>Possible forms of stream specifiers are:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt><samp class="option"><var class="var">stream_index</var></samp></dt>
|
|
||||||
<dd><p>Matches the stream with this index. E.g. <code class="code">-threads:1 4</code> would set the
|
|
||||||
thread count for the second stream to 4. If <var class="var">stream_index</var> is used as an
|
|
||||||
additional stream specifier (see below), then it selects stream number
|
|
||||||
<var class="var">stream_index</var> from the matching streams. Stream numbering is based on the
|
|
||||||
order of the streams as detected by libavformat except when a program ID is
|
|
||||||
also specified. In this case it is based on the ordering of the streams in the
|
|
||||||
program.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option"><var class="var">stream_type</var>[:<var class="var">additional_stream_specifier</var>]</samp></dt>
|
|
||||||
<dd><p><var class="var">stream_type</var> is one of following: ’v’ or ’V’ for video, ’a’ for audio, ’s’
|
|
||||||
for subtitle, ’d’ for data, and ’t’ for attachments. ’v’ matches all video
|
|
||||||
streams, ’V’ only matches video streams which are not attached pictures, video
|
|
||||||
thumbnails or cover arts. If <var class="var">additional_stream_specifier</var> is used, then
|
|
||||||
it matches streams which both have this type and match the
|
|
||||||
<var class="var">additional_stream_specifier</var>. Otherwise, it matches all streams of the
|
|
||||||
specified type.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">p:<var class="var">program_id</var>[:<var class="var">additional_stream_specifier</var>]</samp></dt>
|
|
||||||
<dd><p>Matches streams which are in the program with the id <var class="var">program_id</var>. If
|
|
||||||
<var class="var">additional_stream_specifier</var> is used, then it matches streams which both
|
|
||||||
are part of the program and match the <var class="var">additional_stream_specifier</var>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">#<var class="var">stream_id</var> or i:<var class="var">stream_id</var></samp></dt>
|
|
||||||
<dd><p>Match the stream by stream id (e.g. PID in MPEG-TS container).
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">m:<var class="var">key</var>[:<var class="var">value</var>]</samp></dt>
|
|
||||||
<dd><p>Matches streams with the metadata tag <var class="var">key</var> having the specified value. If
|
|
||||||
<var class="var">value</var> is not given, matches streams that contain the given tag with any
|
|
||||||
value.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">u</samp></dt>
|
|
||||||
<dd><p>Matches streams with usable configuration, the codec must be defined and the
|
|
||||||
essential information such as video dimension or audio sample rate must be present.
|
|
||||||
</p>
|
|
||||||
<p>Note that in <code class="command">ffmpeg</code>, matching by metadata will only work properly for
|
|
||||||
input files.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Generic-options">
|
|
||||||
<h3 class="section">3.2 Generic options</h3>
|
|
||||||
|
|
||||||
<p>These options are shared amongst the ff* tools.
|
|
||||||
</p>
|
|
||||||
<dl class="table">
|
|
||||||
<dt><samp class="option">-L</samp></dt>
|
|
||||||
<dd><p>Show license.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-h, -?, -help, --help [<var class="var">arg</var>]</samp></dt>
|
|
||||||
<dd><p>Show help. An optional parameter may be specified to print help about a specific
|
|
||||||
item. If no argument is specified, only basic (non advanced) tool
|
|
||||||
options are shown.
|
|
||||||
</p>
|
|
||||||
<p>Possible values of <var class="var">arg</var> are:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt><samp class="option">long</samp></dt>
|
|
||||||
<dd><p>Print advanced tool options in addition to the basic tool options.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">full</samp></dt>
|
|
||||||
<dd><p>Print complete list of options, including shared and private options
|
|
||||||
for encoders, decoders, demuxers, muxers, filters, etc.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">decoder=<var class="var">decoder_name</var></samp></dt>
|
|
||||||
<dd><p>Print detailed information about the decoder named <var class="var">decoder_name</var>. Use the
|
|
||||||
<samp class="option">-decoders</samp> option to get a list of all decoders.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">encoder=<var class="var">encoder_name</var></samp></dt>
|
|
||||||
<dd><p>Print detailed information about the encoder named <var class="var">encoder_name</var>. Use the
|
|
||||||
<samp class="option">-encoders</samp> option to get a list of all encoders.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">demuxer=<var class="var">demuxer_name</var></samp></dt>
|
|
||||||
<dd><p>Print detailed information about the demuxer named <var class="var">demuxer_name</var>. Use the
|
|
||||||
<samp class="option">-formats</samp> option to get a list of all demuxers and muxers.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">muxer=<var class="var">muxer_name</var></samp></dt>
|
|
||||||
<dd><p>Print detailed information about the muxer named <var class="var">muxer_name</var>. Use the
|
|
||||||
<samp class="option">-formats</samp> option to get a list of all muxers and demuxers.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">filter=<var class="var">filter_name</var></samp></dt>
|
|
||||||
<dd><p>Print detailed information about the filter named <var class="var">filter_name</var>. Use the
|
|
||||||
<samp class="option">-filters</samp> option to get a list of all filters.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">bsf=<var class="var">bitstream_filter_name</var></samp></dt>
|
|
||||||
<dd><p>Print detailed information about the bitstream filter named <var class="var">bitstream_filter_name</var>.
|
|
||||||
Use the <samp class="option">-bsfs</samp> option to get a list of all bitstream filters.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">protocol=<var class="var">protocol_name</var></samp></dt>
|
|
||||||
<dd><p>Print detailed information about the protocol named <var class="var">protocol_name</var>.
|
|
||||||
Use the <samp class="option">-protocols</samp> option to get a list of all protocols.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-version</samp></dt>
|
|
||||||
<dd><p>Show version.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-buildconf</samp></dt>
|
|
||||||
<dd><p>Show the build configuration, one option per line.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-formats</samp></dt>
|
|
||||||
<dd><p>Show available formats (including devices).
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-demuxers</samp></dt>
|
|
||||||
<dd><p>Show available demuxers.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-muxers</samp></dt>
|
|
||||||
<dd><p>Show available muxers.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-devices</samp></dt>
|
|
||||||
<dd><p>Show available devices.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-codecs</samp></dt>
|
|
||||||
<dd><p>Show all codecs known to libavcodec.
|
|
||||||
</p>
|
|
||||||
<p>Note that the term ’codec’ is used throughout this documentation as a shortcut
|
|
||||||
for what is more correctly called a media bitstream format.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-decoders</samp></dt>
|
|
||||||
<dd><p>Show available decoders.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-encoders</samp></dt>
|
|
||||||
<dd><p>Show all available encoders.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-bsfs</samp></dt>
|
|
||||||
<dd><p>Show available bitstream filters.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-protocols</samp></dt>
|
|
||||||
<dd><p>Show available protocols.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-filters</samp></dt>
|
|
||||||
<dd><p>Show available libavfilter filters.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-pix_fmts</samp></dt>
|
|
||||||
<dd><p>Show available pixel formats.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-sample_fmts</samp></dt>
|
|
||||||
<dd><p>Show available sample formats.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-layouts</samp></dt>
|
|
||||||
<dd><p>Show channel names and standard channel layouts.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-dispositions</samp></dt>
|
|
||||||
<dd><p>Show stream dispositions.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-colors</samp></dt>
|
|
||||||
<dd><p>Show recognized color names.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-sources <var class="var">device</var>[,<var class="var">opt1</var>=<var class="var">val1</var>[,<var class="var">opt2</var>=<var class="var">val2</var>]...]</samp></dt>
|
|
||||||
<dd><p>Show autodetected sources of the input device.
|
|
||||||
Some devices may provide system-dependent source names that cannot be autodetected.
|
|
||||||
The returned list cannot be assumed to be always complete.
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -sources pulse,server=192.168.0.4
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-sinks <var class="var">device</var>[,<var class="var">opt1</var>=<var class="var">val1</var>[,<var class="var">opt2</var>=<var class="var">val2</var>]...]</samp></dt>
|
|
||||||
<dd><p>Show autodetected sinks of the output device.
|
|
||||||
Some devices may provide system-dependent sink names that cannot be autodetected.
|
|
||||||
The returned list cannot be assumed to be always complete.
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -sinks pulse,server=192.168.0.4
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-loglevel [<var class="var">flags</var>+]<var class="var">loglevel</var> | -v [<var class="var">flags</var>+]<var class="var">loglevel</var></samp></dt>
|
|
||||||
<dd><p>Set logging level and flags used by the library.
|
|
||||||
</p>
|
|
||||||
<p>The optional <var class="var">flags</var> prefix can consist of the following values:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">repeat</samp>’</dt>
|
|
||||||
<dd><p>Indicates that repeated log output should not be compressed to the first line
|
|
||||||
and the "Last message repeated n times" line will be omitted.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">level</samp>’</dt>
|
|
||||||
<dd><p>Indicates that log output should add a <code class="code">[level]</code> prefix to each message
|
|
||||||
line. This can be used as an alternative to log coloring, e.g. when dumping the
|
|
||||||
log to file.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
<p>Flags can also be used alone by adding a ’+’/’-’ prefix to set/reset a single
|
|
||||||
flag without affecting other <var class="var">flags</var> or changing <var class="var">loglevel</var>. When
|
|
||||||
setting both <var class="var">flags</var> and <var class="var">loglevel</var>, a ’+’ separator is expected
|
|
||||||
between the last <var class="var">flags</var> value and before <var class="var">loglevel</var>.
|
|
||||||
</p>
|
|
||||||
<p><var class="var">loglevel</var> is a string or a number containing one of the following values:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">quiet, -8</samp>’</dt>
|
|
||||||
<dd><p>Show nothing at all; be silent.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">panic, 0</samp>’</dt>
|
|
||||||
<dd><p>Only show fatal errors which could lead the process to crash, such as
|
|
||||||
an assertion failure. This is not currently used for anything.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">fatal, 8</samp>’</dt>
|
|
||||||
<dd><p>Only show fatal errors. These are errors after which the process absolutely
|
|
||||||
cannot continue.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">error, 16</samp>’</dt>
|
|
||||||
<dd><p>Show all errors, including ones which can be recovered from.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">warning, 24</samp>’</dt>
|
|
||||||
<dd><p>Show all warnings and errors. Any message related to possibly
|
|
||||||
incorrect or unexpected events will be shown.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">info, 32</samp>’</dt>
|
|
||||||
<dd><p>Show informative messages during processing. This is in addition to
|
|
||||||
warnings and errors. This is the default value.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">verbose, 40</samp>’</dt>
|
|
||||||
<dd><p>Same as <code class="code">info</code>, except more verbose.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">debug, 48</samp>’</dt>
|
|
||||||
<dd><p>Show everything, including debugging information.
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">trace, 56</samp>’</dt>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>For example to enable repeated log output, add the <code class="code">level</code> prefix, and set
|
|
||||||
<var class="var">loglevel</var> to <code class="code">verbose</code>:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -loglevel repeat+level+verbose -i input output
|
|
||||||
</pre></div>
|
|
||||||
<p>Another example that enables repeated log output without affecting current
|
|
||||||
state of <code class="code">level</code> prefix flag or <var class="var">loglevel</var>:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg [...] -loglevel +repeat
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>By default the program logs to stderr. If coloring is supported by the
|
|
||||||
terminal, colors are used to mark errors and warnings. Log coloring
|
|
||||||
can be disabled setting the environment variable
|
|
||||||
<code class="env">AV_LOG_FORCE_NOCOLOR</code>, or can be forced setting
|
|
||||||
the environment variable <code class="env">AV_LOG_FORCE_COLOR</code>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-report</samp></dt>
|
|
||||||
<dd><p>Dump full command line and log output to a file named
|
|
||||||
<code class="code"><var class="var">program</var>-<var class="var">YYYYMMDD</var>-<var class="var">HHMMSS</var>.log</code> in the current
|
|
||||||
directory.
|
|
||||||
This file can be useful for bug reports.
|
|
||||||
It also implies <code class="code">-loglevel debug</code>.
|
|
||||||
</p>
|
|
||||||
<p>Setting the environment variable <code class="env">FFREPORT</code> to any value has the
|
|
||||||
same effect. If the value is a ’:’-separated key=value sequence, these
|
|
||||||
options will affect the report; option values must be escaped if they
|
|
||||||
contain special characters or the options delimiter ’:’ (see the
|
|
||||||
“Quoting and escaping” section in the ffmpeg-utils manual).
|
|
||||||
</p>
|
|
||||||
<p>The following options are recognized:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt><samp class="option">file</samp></dt>
|
|
||||||
<dd><p>set the file name to use for the report; <code class="code">%p</code> is expanded to the name
|
|
||||||
of the program, <code class="code">%t</code> is expanded to a timestamp, <code class="code">%%</code> is expanded
|
|
||||||
to a plain <code class="code">%</code>
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">level</samp></dt>
|
|
||||||
<dd><p>set the log verbosity level using a numerical value (see <code class="code">-loglevel</code>).
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>For example, to output a report to a file named <samp class="file">ffreport.log</samp>
|
|
||||||
using a log level of <code class="code">32</code> (alias for log level <code class="code">info</code>):
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Errors in parsing the environment variable are not fatal, and will not
|
|
||||||
appear in the report.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-hide_banner</samp></dt>
|
|
||||||
<dd><p>Suppress printing banner.
|
|
||||||
</p>
|
|
||||||
<p>All FFmpeg tools will normally show a copyright notice, build options
|
|
||||||
and library versions. This option can be used to suppress printing
|
|
||||||
this information.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-cpuflags flags (<em class="emph">global</em>)</samp></dt>
|
|
||||||
<dd><p>Allows setting and clearing cpu flags. This option is intended
|
|
||||||
for testing. Do not use it unless you know what you’re doing.
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -cpuflags -sse+mmx ...
|
|
||||||
ffmpeg -cpuflags mmx ...
|
|
||||||
ffmpeg -cpuflags 0 ...
|
|
||||||
</pre></div>
|
|
||||||
<p>Possible flags for this option are:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">x86</samp>’</dt>
|
|
||||||
<dd><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">mmx</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">mmxext</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">sse</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">sse2</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">sse2slow</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">sse3</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">sse3slow</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">ssse3</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">atom</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">sse4.1</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">sse4.2</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">avx</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">avx2</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">xop</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">fma3</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">fma4</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">3dnow</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">3dnowext</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">bmi1</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">bmi2</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">cmov</samp>’</dt>
|
|
||||||
</dl>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">ARM</samp>’</dt>
|
|
||||||
<dd><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">armv5te</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">armv6</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">armv6t2</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">vfp</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">vfpv3</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">neon</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">setend</samp>’</dt>
|
|
||||||
</dl>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">AArch64</samp>’</dt>
|
|
||||||
<dd><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">armv8</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">vfp</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">neon</samp>’</dt>
|
|
||||||
</dl>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">PowerPC</samp>’</dt>
|
|
||||||
<dd><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">altivec</samp>’</dt>
|
|
||||||
</dl>
|
|
||||||
</dd>
|
|
||||||
<dt>‘<samp class="samp">Specific Processors</samp>’</dt>
|
|
||||||
<dd><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">pentium2</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">pentium3</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">pentium4</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">k6</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">k62</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">athlon</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">athlonxp</samp>’</dt>
|
|
||||||
<dt>‘<samp class="samp">k8</samp>’</dt>
|
|
||||||
</dl>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-cpucount <var class="var">count</var> (<em class="emph">global</em>)</samp></dt>
|
|
||||||
<dd><p>Override detection of CPU count. This option is intended
|
|
||||||
for testing. Do not use it unless you know what you’re doing.
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -cpucount 2
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-max_alloc <var class="var">bytes</var></samp></dt>
|
|
||||||
<dd><p>Set the maximum size limit for allocating a block on the heap by ffmpeg’s
|
|
||||||
family of malloc functions. Exercise <strong class="strong">extreme caution</strong> when using
|
|
||||||
this option. Don’t use if you do not understand the full consequence of doing so.
|
|
||||||
Default is INT_MAX.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="AVOptions">
|
|
||||||
<h3 class="section">3.3 AVOptions</h3>
|
|
||||||
|
|
||||||
<p>These options are provided directly by the libavformat, libavdevice and
|
|
||||||
libavcodec libraries. To see the list of available AVOptions, use the
|
|
||||||
<samp class="option">-help</samp> option. They are separated into two categories:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt><samp class="option">generic</samp></dt>
|
|
||||||
<dd><p>These options can be set for any container, codec or device. Generic options
|
|
||||||
are listed under AVFormatContext options for containers/devices and under
|
|
||||||
AVCodecContext options for codecs.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">private</samp></dt>
|
|
||||||
<dd><p>These options are specific to the given container, device or codec. Private
|
|
||||||
options are listed under their corresponding containers/devices/codecs.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>For example to write an ID3v2.3 header instead of a default ID3v2.4 to
|
|
||||||
an MP3 file, use the <samp class="option">id3v2_version</samp> private option of the MP3
|
|
||||||
muxer:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i input.flac -id3v2_version 3 out.mp3
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>All codec AVOptions are per-stream, and thus a stream specifier
|
|
||||||
should be attached to them:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>In the above example, a multichannel audio stream is mapped twice for output.
|
|
||||||
The first instance is encoded with codec ac3 and bitrate 640k.
|
|
||||||
The second instance is downmixed to 2 channels and encoded with codec aac. A bitrate of 128k is specified for it using
|
|
||||||
absolute index of the output stream.
|
|
||||||
</p>
|
|
||||||
<p>Note: the <samp class="option">-nooption</samp> syntax cannot be used for boolean
|
|
||||||
AVOptions, use <samp class="option">-option 0</samp>/<samp class="option">-option 1</samp>.
|
|
||||||
</p>
|
|
||||||
<p>Note: the old undocumented way of specifying per-stream AVOptions by
|
|
||||||
prepending v/a/s to the options name is now obsolete and will be
|
|
||||||
removed soon.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Main-options">
|
|
||||||
<h3 class="section">3.4 Main options</h3>
|
|
||||||
|
|
||||||
<dl class="table">
|
|
||||||
<dt><samp class="option">-x <var class="var">width</var></samp></dt>
|
|
||||||
<dd><p>Force displayed width.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-y <var class="var">height</var></samp></dt>
|
|
||||||
<dd><p>Force displayed height.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-fs</samp></dt>
|
|
||||||
<dd><p>Start in fullscreen mode.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-an</samp></dt>
|
|
||||||
<dd><p>Disable audio.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-vn</samp></dt>
|
|
||||||
<dd><p>Disable video.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-sn</samp></dt>
|
|
||||||
<dd><p>Disable subtitles.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-ss <var class="var">pos</var></samp></dt>
|
|
||||||
<dd><p>Seek to <var class="var">pos</var>. Note that in most formats it is not possible to seek
|
|
||||||
exactly, so <code class="command">ffplay</code> will seek to the nearest seek point to
|
|
||||||
<var class="var">pos</var>.
|
|
||||||
</p>
|
|
||||||
<p><var class="var">pos</var> must be a time duration specification,
|
|
||||||
see <a data-manual="ffmpeg-utils" href="ffmpeg-utils.html#time-duration-syntax">(ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual</a>.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-t <var class="var">duration</var></samp></dt>
|
|
||||||
<dd><p>Play <var class="var">duration</var> seconds of audio/video.
|
|
||||||
</p>
|
|
||||||
<p><var class="var">duration</var> must be a time duration specification,
|
|
||||||
see <a data-manual="ffmpeg-utils" href="ffmpeg-utils.html#time-duration-syntax">(ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual</a>.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-bytes</samp></dt>
|
|
||||||
<dd><p>Seek by bytes.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-seek_interval</samp></dt>
|
|
||||||
<dd><p>Set custom interval, in seconds, for seeking using left/right keys. Default is 10 seconds.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-nodisp</samp></dt>
|
|
||||||
<dd><p>Disable graphical display.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-noborder</samp></dt>
|
|
||||||
<dd><p>Borderless window.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-alwaysontop</samp></dt>
|
|
||||||
<dd><p>Window always on top. Available on: X11 with SDL >= 2.0.5, Windows SDL >= 2.0.6.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-volume</samp></dt>
|
|
||||||
<dd><p>Set the startup volume. 0 means silence, 100 means no volume reduction or
|
|
||||||
amplification. Negative values are treated as 0, values above 100 are treated
|
|
||||||
as 100.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-f <var class="var">fmt</var></samp></dt>
|
|
||||||
<dd><p>Force format.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-window_title <var class="var">title</var></samp></dt>
|
|
||||||
<dd><p>Set window title (default is the input filename).
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-left <var class="var">title</var></samp></dt>
|
|
||||||
<dd><p>Set the x position for the left of the window (default is a centered window).
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-top <var class="var">title</var></samp></dt>
|
|
||||||
<dd><p>Set the y position for the top of the window (default is a centered window).
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-loop <var class="var">number</var></samp></dt>
|
|
||||||
<dd><p>Loops movie playback <number> times. 0 means forever.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-showmode <var class="var">mode</var></samp></dt>
|
|
||||||
<dd><p>Set the show mode to use.
|
|
||||||
Available values for <var class="var">mode</var> are:
|
|
||||||
</p><dl class="table">
|
|
||||||
<dt>‘<samp class="samp">0, video</samp>’</dt>
|
|
||||||
<dd><p>show video
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">1, waves</samp>’</dt>
|
|
||||||
<dd><p>show audio waves
|
|
||||||
</p></dd>
|
|
||||||
<dt>‘<samp class="samp">2, rdft</samp>’</dt>
|
|
||||||
<dd><p>show audio frequency band using RDFT ((Inverse) Real Discrete Fourier Transform)
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>Default value is "video", if video is not present or cannot be played
|
|
||||||
"rdft" is automatically selected.
|
|
||||||
</p>
|
|
||||||
<p>You can interactively cycle through the available show modes by
|
|
||||||
pressing the key <kbd class="key">w</kbd>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-vf <var class="var">filtergraph</var></samp></dt>
|
|
||||||
<dd><p>Create the filtergraph specified by <var class="var">filtergraph</var> and use it to
|
|
||||||
filter the video stream.
|
|
||||||
</p>
|
|
||||||
<p><var class="var">filtergraph</var> is a description of the filtergraph to apply to
|
|
||||||
the stream, and must have a single video input and a single video
|
|
||||||
output. In the filtergraph, the input is associated to the label
|
|
||||||
<code class="code">in</code>, and the output to the label <code class="code">out</code>. See the
|
|
||||||
ffmpeg-filters manual for more information about the filtergraph
|
|
||||||
syntax.
|
|
||||||
</p>
|
|
||||||
<p>You can specify this parameter multiple times and cycle through the specified
|
|
||||||
filtergraphs along with the show modes by pressing the key <kbd class="key">w</kbd>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-af <var class="var">filtergraph</var></samp></dt>
|
|
||||||
<dd><p><var class="var">filtergraph</var> is a description of the filtergraph to apply to
|
|
||||||
the input audio.
|
|
||||||
Use the option "-filters" to show all the available filters (including
|
|
||||||
sources and sinks).
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-i <var class="var">input_url</var></samp></dt>
|
|
||||||
<dd><p>Read <var class="var">input_url</var>.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Advanced-options">
|
|
||||||
<h3 class="section">3.5 Advanced options</h3>
|
|
||||||
<dl class="table">
|
|
||||||
<dt><samp class="option">-stats</samp></dt>
|
|
||||||
<dd><p>Print several playback statistics, in particular show the stream
|
|
||||||
duration, the codec parameters, the current position in the stream and
|
|
||||||
the audio/video synchronisation drift. It is shown by default, unless the
|
|
||||||
log level is lower than <code class="code">info</code>. Its display can be forced by manually
|
|
||||||
specifying this option. To disable it, you need to specify <code class="code">-nostats</code>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-fast</samp></dt>
|
|
||||||
<dd><p>Non-spec-compliant optimizations.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-genpts</samp></dt>
|
|
||||||
<dd><p>Generate pts.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-sync <var class="var">type</var></samp></dt>
|
|
||||||
<dd><p>Set the master clock to audio (<code class="code">type=audio</code>), video
|
|
||||||
(<code class="code">type=video</code>) or external (<code class="code">type=ext</code>). Default is audio. The
|
|
||||||
master clock is used to control audio-video synchronization. Most media
|
|
||||||
players use audio as master clock, but in some cases (streaming or high
|
|
||||||
quality broadcast) it is necessary to change that. This option is mainly
|
|
||||||
used for debugging purposes.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-ast <var class="var">audio_stream_specifier</var></samp></dt>
|
|
||||||
<dd><p>Select the desired audio stream using the given stream specifier. The stream
|
|
||||||
specifiers are described in the <a class="ref" href="#Stream-specifiers">Stream specifiers</a> chapter. If this option
|
|
||||||
is not specified, the "best" audio stream is selected in the program of the
|
|
||||||
already selected video stream.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-vst <var class="var">video_stream_specifier</var></samp></dt>
|
|
||||||
<dd><p>Select the desired video stream using the given stream specifier. The stream
|
|
||||||
specifiers are described in the <a class="ref" href="#Stream-specifiers">Stream specifiers</a> chapter. If this option
|
|
||||||
is not specified, the "best" video stream is selected.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-sst <var class="var">subtitle_stream_specifier</var></samp></dt>
|
|
||||||
<dd><p>Select the desired subtitle stream using the given stream specifier. The stream
|
|
||||||
specifiers are described in the <a class="ref" href="#Stream-specifiers">Stream specifiers</a> chapter. If this option
|
|
||||||
is not specified, the "best" subtitle stream is selected in the program of the
|
|
||||||
already selected video or audio stream.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-autoexit</samp></dt>
|
|
||||||
<dd><p>Exit when video is done playing.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-exitonkeydown</samp></dt>
|
|
||||||
<dd><p>Exit if any key is pressed.
|
|
||||||
</p></dd>
|
|
||||||
<dt><samp class="option">-exitonmousedown</samp></dt>
|
|
||||||
<dd><p>Exit if any mouse button is pressed.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-codec:<var class="var">media_specifier</var> <var class="var">codec_name</var></samp></dt>
|
|
||||||
<dd><p>Force a specific decoder implementation for the stream identified by
|
|
||||||
<var class="var">media_specifier</var>, which can assume the values <code class="code">a</code> (audio),
|
|
||||||
<code class="code">v</code> (video), and <code class="code">s</code> subtitle.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-acodec <var class="var">codec_name</var></samp></dt>
|
|
||||||
<dd><p>Force a specific audio decoder.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-vcodec <var class="var">codec_name</var></samp></dt>
|
|
||||||
<dd><p>Force a specific video decoder.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-scodec <var class="var">codec_name</var></samp></dt>
|
|
||||||
<dd><p>Force a specific subtitle decoder.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-autorotate</samp></dt>
|
|
||||||
<dd><p>Automatically rotate the video according to file metadata. Enabled by
|
|
||||||
default, use <samp class="option">-noautorotate</samp> to disable it.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-framedrop</samp></dt>
|
|
||||||
<dd><p>Drop video frames if video is out of sync. Enabled by default if the master
|
|
||||||
clock is not set to video. Use this option to enable frame dropping for all
|
|
||||||
master clock sources, use <samp class="option">-noframedrop</samp> to disable it.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-infbuf</samp></dt>
|
|
||||||
<dd><p>Do not limit the input buffer size, read as much data as possible from the
|
|
||||||
input as soon as possible. Enabled by default for realtime streams, where data
|
|
||||||
may be dropped if not read in time. Use this option to enable infinite buffers
|
|
||||||
for all inputs, use <samp class="option">-noinfbuf</samp> to disable it.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><samp class="option">-filter_threads <var class="var">nb_threads</var></samp></dt>
|
|
||||||
<dd><p>Defines how many threads are used to process a filter pipeline. Each pipeline
|
|
||||||
will produce a thread pool with this many threads available for parallel
|
|
||||||
processing. The default is 0 which means that the thread count will be
|
|
||||||
determined by the number of available CPUs.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="While-playing">
|
|
||||||
<h3 class="section">3.6 While playing</h3>
|
|
||||||
|
|
||||||
<dl class="table">
|
|
||||||
<dt><kbd class="key">q, ESC</kbd></dt>
|
|
||||||
<dd><p>Quit.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">f</kbd></dt>
|
|
||||||
<dd><p>Toggle full screen.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">p, SPC</kbd></dt>
|
|
||||||
<dd><p>Pause.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">m</kbd></dt>
|
|
||||||
<dd><p>Toggle mute.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">9, 0</kbd></dt>
|
|
||||||
<dt><kbd class="key">/, *</kbd></dt>
|
|
||||||
<dd><p>Decrease and increase volume respectively.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">a</kbd></dt>
|
|
||||||
<dd><p>Cycle audio channel in the current program.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">v</kbd></dt>
|
|
||||||
<dd><p>Cycle video channel.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">t</kbd></dt>
|
|
||||||
<dd><p>Cycle subtitle channel in the current program.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">c</kbd></dt>
|
|
||||||
<dd><p>Cycle program.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">w</kbd></dt>
|
|
||||||
<dd><p>Cycle video filters or show modes.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">s</kbd></dt>
|
|
||||||
<dd><p>Step to the next frame.
|
|
||||||
</p>
|
|
||||||
<p>Pause if the stream is not already paused, step to the next video
|
|
||||||
frame, and pause.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">left/right</kbd></dt>
|
|
||||||
<dd><p>Seek backward/forward 10 seconds.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">down/up</kbd></dt>
|
|
||||||
<dd><p>Seek backward/forward 1 minute.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">page down/page up</kbd></dt>
|
|
||||||
<dd><p>Seek to the previous/next chapter.
|
|
||||||
or if there are no chapters
|
|
||||||
Seek backward/forward 10 minutes.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">right mouse click</kbd></dt>
|
|
||||||
<dd><p>Seek to percentage in file corresponding to fraction of width.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><kbd class="key">left mouse double-click</kbd></dt>
|
|
||||||
<dd><p>Toggle full screen.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">4 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffplay-all.html">ffmpeg-all</a>,
|
|
||||||
<a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="ffmpeg-utils.html">ffmpeg-utils</a>,
|
|
||||||
<a class="url" href="ffmpeg-scaler.html">ffmpeg-scaler</a>,
|
|
||||||
<a class="url" href="ffmpeg-resampler.html">ffmpeg-resampler</a>,
|
|
||||||
<a class="url" href="ffmpeg-codecs.html">ffmpeg-codecs</a>,
|
|
||||||
<a class="url" href="ffmpeg-bitstream-filters.html">ffmpeg-bitstream-filters</a>,
|
|
||||||
<a class="url" href="ffmpeg-formats.html">ffmpeg-formats</a>,
|
|
||||||
<a class="url" href="ffmpeg-devices.html">ffmpeg-devices</a>,
|
|
||||||
<a class="url" href="ffmpeg-protocols.html">ffmpeg-protocols</a>,
|
|
||||||
<a class="url" href="ffmpeg-filters.html">ffmpeg-filters</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">5 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,624 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Using Git to develop FFmpeg</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Using Git to develop FFmpeg">
|
|
||||||
<meta name="keywords" content="Using Git to develop FFmpeg">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
div.example {margin-left: 3.2em}
|
|
||||||
ul.mark-bullet {list-style-type: disc}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Introduction" href="#Introduction">1 Introduction</a></li>
|
|
||||||
<li><a id="toc-Basics-Usage" href="#Basics-Usage">2 Basics Usage</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Get-Git" href="#Get-Git">2.1 Get Git</a></li>
|
|
||||||
<li><a id="toc-Cloning-the-source-tree" href="#Cloning-the-source-tree">2.2 Cloning the source tree</a></li>
|
|
||||||
<li><a id="toc-Updating-the-source-tree-to-the-latest-revision-1" href="#Updating-the-source-tree-to-the-latest-revision-1">2.3 Updating the source tree to the latest revision</a></li>
|
|
||||||
<li><a id="toc-Rebasing-your-local-branches" href="#Rebasing-your-local-branches">2.4 Rebasing your local branches</a></li>
|
|
||||||
<li><a id="toc-Adding_002fremoving-files_002fdirectories" href="#Adding_002fremoving-files_002fdirectories">2.5 Adding/removing files/directories</a></li>
|
|
||||||
<li><a id="toc-Showing-modifications" href="#Showing-modifications">2.6 Showing modifications</a></li>
|
|
||||||
<li><a id="toc-Inspecting-the-changelog" href="#Inspecting-the-changelog">2.7 Inspecting the changelog</a></li>
|
|
||||||
<li><a id="toc-Checking-source-tree-status" href="#Checking-source-tree-status">2.8 Checking source tree status</a></li>
|
|
||||||
<li><a id="toc-Committing" href="#Committing">2.9 Committing</a></li>
|
|
||||||
<li><a id="toc-Writing-a-commit-message" href="#Writing-a-commit-message">2.10 Writing a commit message</a></li>
|
|
||||||
<li><a id="toc-Preparing-a-patchset" href="#Preparing-a-patchset">2.11 Preparing a patchset</a></li>
|
|
||||||
<li><a id="toc-Sending-patches-for-review" href="#Sending-patches-for-review">2.12 Sending patches for review</a></li>
|
|
||||||
<li><a id="toc-Renaming_002fmoving_002fcopying-files-or-contents-of-files" href="#Renaming_002fmoving_002fcopying-files-or-contents-of-files">2.13 Renaming/moving/copying files or contents of files</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Git-configuration" href="#Git-configuration">3 Git configuration</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Personal-Git-installation" href="#Personal-Git-installation">3.1 Personal Git installation</a></li>
|
|
||||||
<li><a id="toc-Repository-configuration" href="#Repository-configuration">3.2 Repository configuration</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-FFmpeg-specific" href="#FFmpeg-specific">4 FFmpeg specific</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Reverting-broken-commits" href="#Reverting-broken-commits">4.1 Reverting broken commits</a></li>
|
|
||||||
<li><a id="toc-Pushing-changes-to-remote-trees" href="#Pushing-changes-to-remote-trees">4.2 Pushing changes to remote trees</a></li>
|
|
||||||
<li><a id="toc-Finding-a-specific-svn-revision" href="#Finding-a-specific-svn-revision">4.3 Finding a specific svn revision</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-gpg-key-generation" href="#gpg-key-generation">5 gpg key generation</a></li>
|
|
||||||
<li><a id="toc-Pre_002dpush-checklist" href="#Pre_002dpush-checklist">6 Pre-push checklist</a></li>
|
|
||||||
<li><a id="toc-Server-Issues" href="#Server-Issues">7 Server Issues</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Introduction">
|
|
||||||
<h2 class="chapter">1 Introduction</h2>
|
|
||||||
|
|
||||||
<p>This document aims in giving some quick references on a set of useful Git
|
|
||||||
commands. You should always use the extensive and detailed documentation
|
|
||||||
provided directly by Git:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git --help
|
|
||||||
man git
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>shows you the available subcommands,
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git <command> --help
|
|
||||||
man git-<command>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>shows information about the subcommand <command>.
|
|
||||||
</p>
|
|
||||||
<p>Additional information could be found on the
|
|
||||||
<a class="url" href="http://gitref.org">Git Reference</a> website.
|
|
||||||
</p>
|
|
||||||
<p>For more information about the Git project, visit the
|
|
||||||
<a class="url" href="http://git-scm.com/">Git website</a>.
|
|
||||||
</p>
|
|
||||||
<p>Consult these resources whenever you have problems, they are quite exhaustive.
|
|
||||||
</p>
|
|
||||||
<p>What follows now is a basic introduction to Git and some FFmpeg-specific
|
|
||||||
guidelines to ease the contribution to the project.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Basics-Usage">
|
|
||||||
<h2 class="chapter">2 Basics Usage</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Get-Git" accesskey="1">Get Git</a></li>
|
|
||||||
<li><a href="#Cloning-the-source-tree" accesskey="2">Cloning the source tree</a></li>
|
|
||||||
<li><a href="#Updating-the-source-tree-to-the-latest-revision-1" accesskey="3">Updating the source tree to the latest revision</a></li>
|
|
||||||
<li><a href="#Rebasing-your-local-branches" accesskey="4">Rebasing your local branches</a></li>
|
|
||||||
<li><a href="#Adding_002fremoving-files_002fdirectories" accesskey="5">Adding/removing files/directories</a></li>
|
|
||||||
<li><a href="#Showing-modifications" accesskey="6">Showing modifications</a></li>
|
|
||||||
<li><a href="#Inspecting-the-changelog" accesskey="7">Inspecting the changelog</a></li>
|
|
||||||
<li><a href="#Checking-source-tree-status" accesskey="8">Checking source tree status</a></li>
|
|
||||||
<li><a href="#Committing" accesskey="9">Committing</a></li>
|
|
||||||
<li><a href="#Writing-a-commit-message">Writing a commit message</a></li>
|
|
||||||
<li><a href="#Preparing-a-patchset">Preparing a patchset</a></li>
|
|
||||||
<li><a href="#Sending-patches-for-review">Sending patches for review</a></li>
|
|
||||||
<li><a href="#Renaming_002fmoving_002fcopying-files-or-contents-of-files">Renaming/moving/copying files or contents of files</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Get-Git">
|
|
||||||
<h3 class="section">2.1 Get Git</h3>
|
|
||||||
|
|
||||||
<p>You can get Git from <a class="url" href="http://git-scm.com/">http://git-scm.com/</a>
|
|
||||||
Most distribution and operating system provide a package for it.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Cloning-the-source-tree">
|
|
||||||
<h3 class="section">2.2 Cloning the source tree</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git clone https://git.ffmpeg.org/ffmpeg.git <target>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>This will put the FFmpeg sources into the directory <var class="var"><target></var>.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git clone git@source.ffmpeg.org:ffmpeg <target>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>This will put the FFmpeg sources into the directory <var class="var"><target></var> and let
|
|
||||||
you push back your changes to the remote repository.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git clone gil@ffmpeg.org:ffmpeg-web <target>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>This will put the source of the FFmpeg website into the directory
|
|
||||||
<var class="var"><target></var> and let you push back your changes to the remote repository.
|
|
||||||
(Note that <var class="var">gil</var> stands for GItoLite and is not a typo of <var class="var">git</var>.)
|
|
||||||
</p>
|
|
||||||
<p>If you don’t have write-access to the ffmpeg-web repository, you can
|
|
||||||
create patches after making a read-only ffmpeg-web clone:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git clone git://ffmpeg.org/ffmpeg-web <target>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Make sure that you do not have Windows line endings in your checkouts,
|
|
||||||
otherwise you may experience spurious compilation failures. One way to
|
|
||||||
achieve this is to run
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git config --global core.autocrlf false
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
|
|
||||||
<a class="anchor" id="Updating-the-source-tree-to-the-latest-revision"></a></div>
|
|
||||||
<div class="section-level-extent" id="Updating-the-source-tree-to-the-latest-revision-1">
|
|
||||||
<h3 class="section">2.3 Updating the source tree to the latest revision</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git pull (--rebase)
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>pulls in the latest changes from the tracked branch. The tracked branch
|
|
||||||
can be remote. By default the master branch tracks the branch master in
|
|
||||||
the remote origin.
|
|
||||||
</p>
|
|
||||||
<div class="float">
|
|
||||||
<p><code class="command">--rebase</code> (see below) is recommended.
|
|
||||||
</p><div class="type-number-float"><p><strong class="strong">IMPORTANT
|
|
||||||
</strong></p></div></div>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Rebasing-your-local-branches">
|
|
||||||
<h3 class="section">2.4 Rebasing your local branches</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git pull --rebase
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>fetches the changes from the main repository and replays your local commits
|
|
||||||
over it. This is required to keep all your local changes at the top of
|
|
||||||
FFmpeg’s master tree. The master tree will reject pushes with merge commits.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Adding_002fremoving-files_002fdirectories">
|
|
||||||
<h3 class="section">2.5 Adding/removing files/directories</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git add [-A] <filename/dirname>
|
|
||||||
git rm [-r] <filename/dirname>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Git needs to get notified of all changes you make to your working
|
|
||||||
directory that makes files appear or disappear.
|
|
||||||
Line moves across files are automatically tracked.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Showing-modifications">
|
|
||||||
<h3 class="section">2.6 Showing modifications</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git diff <filename(s)>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>will show all local modifications in your working directory as unified diff.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Inspecting-the-changelog">
|
|
||||||
<h3 class="section">2.7 Inspecting the changelog</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git log <filename(s)>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>You may also use the graphical tools like <code class="command">gitview</code> or <code class="command">gitk</code>
|
|
||||||
or the web interface available at <a class="url" href="http://source.ffmpeg.org/">http://source.ffmpeg.org/</a>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Checking-source-tree-status">
|
|
||||||
<h3 class="section">2.8 Checking source tree status</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git status
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>detects all the changes you made and lists what actions will be taken in case
|
|
||||||
of a commit (additions, modifications, deletions, etc.).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Committing">
|
|
||||||
<h3 class="section">2.9 Committing</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git diff --check
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>to double check your changes before committing them to avoid trouble later
|
|
||||||
on. All experienced developers do this on each and every commit, no matter
|
|
||||||
how small.
|
|
||||||
</p>
|
|
||||||
<p>Every one of them has been saved from looking like a fool by this many times.
|
|
||||||
It’s very easy for stray debug output or cosmetic modifications to slip in,
|
|
||||||
please avoid problems through this extra level of scrutiny.
|
|
||||||
</p>
|
|
||||||
<p>For cosmetics-only commits you should get (almost) empty output from
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git diff -w -b <filename(s)>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Also check the output of
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git status
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>to make sure you don’t have untracked files or deletions.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git add [-i|-p|-A] <filenames/dirnames>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Make sure you have told Git your name, email address and GPG key
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git config --global user.name "My Name"
|
|
||||||
git config --global user.email my@email.invalid
|
|
||||||
git config --global user.signingkey ABCDEF0123245
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Enable signing all commits or use -S
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git config --global commit.gpgsign true
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Use <samp class="option">--global</samp> to set the global configuration for all your Git checkouts.
|
|
||||||
</p>
|
|
||||||
<p>Git will select the changes to the files for commit. Optionally you can use
|
|
||||||
the interactive or the patch mode to select hunk by hunk what should be
|
|
||||||
added to the commit.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git commit
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Git will commit the selected changes to your current local branch.
|
|
||||||
</p>
|
|
||||||
<p>You will be prompted for a log message in an editor, which is either
|
|
||||||
set in your personal configuration file through
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git config --global core.editor
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>or set by one of the following environment variables:
|
|
||||||
<var class="var">GIT_EDITOR</var>, <var class="var">VISUAL</var> or <var class="var">EDITOR</var>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Writing-a-commit-message">
|
|
||||||
<h3 class="section">2.10 Writing a commit message</h3>
|
|
||||||
|
|
||||||
<p>Log messages should be concise but descriptive.
|
|
||||||
</p>
|
|
||||||
<p>The first line must contain the context, a colon and a very short
|
|
||||||
summary of what the commit does. Details can be added, if necessary,
|
|
||||||
separated by an empty line. These details should not exceed 60-72 characters
|
|
||||||
per line, except when containing code.
|
|
||||||
</p>
|
|
||||||
<p>Example of a good commit message:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">avcodec/cbs: add a helper to read extradata within packet side data
|
|
||||||
|
|
||||||
Using ff_cbs_read() on the raw buffer will not parse it as extradata,
|
|
||||||
resulting in parsing errors for example when handling ISOBMFF avcC.
|
|
||||||
This helper works around that.
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">ptr might be NULL
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If the summary on the first line is not enough, in the body of the message,
|
|
||||||
explain why you made a change, what you did will be obvious from the changes
|
|
||||||
themselves most of the time. Saying just "bug fix" or "10l" is bad. Remember
|
|
||||||
that people of varying skill levels look at and educate themselves while
|
|
||||||
reading through your code. Don’t include filenames in log messages except in
|
|
||||||
the context, Git provides that information.
|
|
||||||
</p>
|
|
||||||
<p>If the commit fixes a registered issue, state it in a separate line of the
|
|
||||||
body: <code class="code">Fix Trac ticket #42.</code>
|
|
||||||
</p>
|
|
||||||
<p>The first line will be used to name
|
|
||||||
the patch by <code class="command">git format-patch</code>.
|
|
||||||
</p>
|
|
||||||
<p>Common mistakes for the first line, as seen in <code class="command">git log --oneline</code>
|
|
||||||
include: missing context at the beginning; description of what the code did
|
|
||||||
before the patch; line too long or wrapped to the second line.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Preparing-a-patchset">
|
|
||||||
<h3 class="section">2.11 Preparing a patchset</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git format-patch <commit> [-o directory]
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>will generate a set of patches for each commit between <var class="var"><commit></var> and
|
|
||||||
current <var class="var">HEAD</var>. E.g.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git format-patch origin/master
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>will generate patches for all commits on current branch which are not
|
|
||||||
present in upstream.
|
|
||||||
A useful shortcut is also
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git format-patch -n
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>which will generate patches from last <var class="var">n</var> commits.
|
|
||||||
By default the patches are created in the current directory.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Sending-patches-for-review">
|
|
||||||
<h3 class="section">2.12 Sending patches for review</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git send-email <commit list|directory>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>will send the patches created by <code class="command">git format-patch</code> or directly
|
|
||||||
generates them. All the email fields can be configured in the global/local
|
|
||||||
configuration or overridden by command line.
|
|
||||||
Note that this tool must often be installed separately (e.g. <var class="var">git-email</var>
|
|
||||||
package on Debian-based distros).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Renaming_002fmoving_002fcopying-files-or-contents-of-files">
|
|
||||||
<h3 class="section">2.13 Renaming/moving/copying files or contents of files</h3>
|
|
||||||
|
|
||||||
<p>Git automatically tracks such changes, making those normal commits.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">mv/cp path/file otherpath/otherfile
|
|
||||||
git add [-A] .
|
|
||||||
git commit
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Git-configuration">
|
|
||||||
<h2 class="chapter">3 Git configuration</h2>
|
|
||||||
|
|
||||||
<p>In order to simplify a few workflows, it is advisable to configure both
|
|
||||||
your personal Git installation and your local FFmpeg repository.
|
|
||||||
</p>
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Personal-Git-installation" accesskey="1">Personal Git installation</a></li>
|
|
||||||
<li><a href="#Repository-configuration" accesskey="2">Repository configuration</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Personal-Git-installation">
|
|
||||||
<h3 class="section">3.1 Personal Git installation</h3>
|
|
||||||
|
|
||||||
<p>Add the following to your <samp class="file">~/.gitconfig</samp> to help <code class="command">git send-email</code>
|
|
||||||
and <code class="command">git format-patch</code> detect renames:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">[diff]
|
|
||||||
renames = copy
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Repository-configuration">
|
|
||||||
<h3 class="section">3.2 Repository configuration</h3>
|
|
||||||
|
|
||||||
<p>In order to have <code class="command">git send-email</code> automatically send patches
|
|
||||||
to the ffmpeg-devel mailing list, add the following stanza
|
|
||||||
to <samp class="file">/path/to/ffmpeg/repository/.git/config</samp>:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">[sendemail]
|
|
||||||
to = ffmpeg-devel@ffmpeg.org
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="FFmpeg-specific">
|
|
||||||
<h2 class="chapter">4 FFmpeg specific</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Reverting-broken-commits" accesskey="1">Reverting broken commits</a></li>
|
|
||||||
<li><a href="#Pushing-changes-to-remote-trees" accesskey="2">Pushing changes to remote trees</a></li>
|
|
||||||
<li><a href="#Finding-a-specific-svn-revision" accesskey="3">Finding a specific svn revision</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Reverting-broken-commits">
|
|
||||||
<h3 class="section">4.1 Reverting broken commits</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git reset <commit>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p><code class="command">git reset</code> will uncommit the changes till <var class="var"><commit></var> rewriting
|
|
||||||
the current branch history.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git commit --amend
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>allows one to amend the last commit details quickly.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git rebase -i origin/master
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>will replay local commits over the main repository allowing to edit, merge
|
|
||||||
or remove some of them in the process.
|
|
||||||
</p>
|
|
||||||
<div class="float">
|
|
||||||
<p><code class="command">git reset</code>, <code class="command">git commit --amend</code> and <code class="command">git rebase</code>
|
|
||||||
rewrite history, so you should use them ONLY on your local or topic branches.
|
|
||||||
The main repository will reject those changes.
|
|
||||||
</p><div class="type-number-float"><p><strong class="strong">NOTE
|
|
||||||
</strong></p></div></div>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git revert <commit>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p><code class="command">git revert</code> will generate a revert commit. This will not make the
|
|
||||||
faulty commit disappear from the history.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Pushing-changes-to-remote-trees">
|
|
||||||
<h3 class="section">4.2 Pushing changes to remote trees</h3>
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git push origin master --dry-run
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Will simulate a push of the local master branch to the default remote
|
|
||||||
(<var class="var">origin</var>). And list which branches and ranges or commits would have been
|
|
||||||
pushed.
|
|
||||||
Git will prevent you from pushing changes if the local and remote trees are
|
|
||||||
out of sync. Refer to <a class="ref" href="#Updating-the-source-tree-to-the-latest-revision">Updating the source tree to the latest revision</a>.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git remote add <name> <url>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Will add additional remote with a name reference, it is useful if you want
|
|
||||||
to push your local branch for review on a remote host.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git push <remote> <refspec>
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Will push the changes to the <var class="var"><remote></var> repository.
|
|
||||||
Omitting <var class="var"><refspec></var> makes <code class="command">git push</code> update all the remote
|
|
||||||
branches matching the local ones.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Finding-a-specific-svn-revision">
|
|
||||||
<h3 class="section">4.3 Finding a specific svn revision</h3>
|
|
||||||
|
|
||||||
<p>Since version 1.7.1 Git supports ‘<samp class="samp">:/foo</samp>’ syntax for specifying commits
|
|
||||||
based on a regular expression. see man gitrevisions
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git show :/'as revision 23456'
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>will show the svn changeset ‘<samp class="samp">r23456</samp>’. With older Git versions searching in
|
|
||||||
the <code class="command">git log</code> output is the easiest option (especially if a pager with
|
|
||||||
search capabilities is used).
|
|
||||||
</p>
|
|
||||||
<p>This commit can be checked out with
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git checkout -b svn_23456 :/'as revision 23456'
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>or for Git < 1.7.1 with
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">git checkout -b svn_23456 $SHA1
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>where <var class="var">$SHA1</var> is the commit hash from the <code class="command">git log</code> output.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="gpg-key-generation">
|
|
||||||
<h2 class="chapter">5 gpg key generation</h2>
|
|
||||||
|
|
||||||
<p>If you have no gpg key yet, we recommend that you create a ed25519 based key as it
|
|
||||||
is small, fast and secure. Especially it results in small signatures in git.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">gpg --default-new-key-algo "ed25519/cert,sign+cv25519/encr" --quick-generate-key "human@server.com"
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>When generating a key, make sure the email specified matches the email used in git as some sites like
|
|
||||||
github consider mismatches a reason to declare such commits unverified. After generating a key you
|
|
||||||
can add it to the MAINTAINER file and upload it to a keyserver.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Pre_002dpush-checklist">
|
|
||||||
<h2 class="chapter">6 Pre-push checklist</h2>
|
|
||||||
|
|
||||||
<p>Once you have a set of commits that you feel are ready for pushing,
|
|
||||||
work through the following checklist to doublecheck everything is in
|
|
||||||
proper order. This list tries to be exhaustive. In case you are just
|
|
||||||
pushing a typo in a comment, some of the steps may be unnecessary.
|
|
||||||
Apply your common sense, but if in doubt, err on the side of caution.
|
|
||||||
</p>
|
|
||||||
<p>First, make sure that the commits and branches you are going to push
|
|
||||||
match what you want pushed and that nothing is missing, extraneous or
|
|
||||||
wrong. You can see what will be pushed by running the git push command
|
|
||||||
with <samp class="option">--dry-run</samp> first. And then inspecting the commits listed with
|
|
||||||
<code class="command">git log -p 1234567..987654</code>. The <code class="command">git status</code> command
|
|
||||||
may help in finding local changes that have been forgotten to be added.
|
|
||||||
</p>
|
|
||||||
<p>Next let the code pass through a full run of our test suite.
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li><code class="command">make distclean</code>
|
|
||||||
</li><li><code class="command">/path/to/ffmpeg/configure</code>
|
|
||||||
</li><li><code class="command">make fate</code>
|
|
||||||
</li><li>if fate fails due to missing samples run <code class="command">make fate-rsync</code> and retry
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<p>Make sure all your changes have been checked before pushing them, the
|
|
||||||
test suite only checks against regressions and that only to some extend. It does
|
|
||||||
obviously not check newly added features/code to be working unless you have
|
|
||||||
added a test for that (which is recommended).
|
|
||||||
</p>
|
|
||||||
<p>Also note that every single commit should pass the test suite, not just
|
|
||||||
the result of a series of patches.
|
|
||||||
</p>
|
|
||||||
<p>Once everything passed, push the changes to your public ffmpeg clone and post a
|
|
||||||
merge request to ffmpeg-devel. You can also push them directly but this is not
|
|
||||||
recommended.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Server-Issues">
|
|
||||||
<h2 class="chapter">7 Server Issues</h2>
|
|
||||||
|
|
||||||
<p>Contact the project admins at <a class="email" href="mailto:root@ffmpeg.org">root@ffmpeg.org</a> if you have technical
|
|
||||||
problems with the Git server.
|
|
||||||
</p></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,85 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Libavcodec Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Libavcodec Documentation">
|
|
||||||
<meta name="keywords" content="Libavcodec Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">2 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">3 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The libavcodec library provides a generic encoding/decoding framework
|
|
||||||
and contains multiple decoders and encoders for audio, video and
|
|
||||||
subtitle streams, and several bitstream filters.
|
|
||||||
</p>
|
|
||||||
<p>The shared architecture provides various services ranging from bit
|
|
||||||
stream I/O to DSP optimizations, and makes it suitable for
|
|
||||||
implementing robust and fast codecs as well as for experimentation.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">2 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="ffmpeg-codecs.html">ffmpeg-codecs</a>, <a class="url" href="ffmpeg-bitstream-filters.html">bitstream-filters</a>,
|
|
||||||
<a class="url" href="libavutil.html">libavutil</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">3 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,82 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Libavdevice Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Libavdevice Documentation">
|
|
||||||
<meta name="keywords" content="Libavdevice Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">2 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">3 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The libavdevice library provides a generic framework for grabbing from
|
|
||||||
and rendering to many common multimedia input/output devices, and
|
|
||||||
supports several input and output devices, including Video4Linux2,
|
|
||||||
VfW, DShow, and ALSA.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">2 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="ffmpeg-devices.html">ffmpeg-devices</a>,
|
|
||||||
<a class="url" href="libavutil.html">libavutil</a>, <a class="url" href="libavcodec.html">libavcodec</a>, <a class="url" href="libavformat.html">libavformat</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">3 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,81 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Libavfilter Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Libavfilter Documentation">
|
|
||||||
<meta name="keywords" content="Libavfilter Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">2 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">3 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The libavfilter library provides a generic audio/video filtering
|
|
||||||
framework containing several filters, sources and sinks.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">2 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="ffmpeg-filters.html">ffmpeg-filters</a>,
|
|
||||||
<a class="url" href="libavutil.html">libavutil</a>, <a class="url" href="libswscale.html">libswscale</a>, <a class="url" href="libswresample.html">libswresample</a>,
|
|
||||||
<a class="url" href="libavcodec.html">libavcodec</a>, <a class="url" href="libavformat.html">libavformat</a>, <a class="url" href="libavdevice.html">libavdevice</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">3 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,85 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Libavformat Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Libavformat Documentation">
|
|
||||||
<meta name="keywords" content="Libavformat Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">2 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">3 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The libavformat library provides a generic framework for multiplexing
|
|
||||||
and demultiplexing (muxing and demuxing) audio, video and subtitle
|
|
||||||
streams. It encompasses multiple muxers and demuxers for multimedia
|
|
||||||
container formats.
|
|
||||||
</p>
|
|
||||||
<p>It also supports several input and output protocols to access a media
|
|
||||||
resource.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">2 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="ffmpeg-formats.html">ffmpeg-formats</a>, <a class="url" href="ffmpeg-protocols.html">ffmpeg-protocols</a>,
|
|
||||||
<a class="url" href="libavutil.html">libavutil</a>, <a class="url" href="libavcodec.html">libavcodec</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">3 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,104 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Libavutil Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Libavutil Documentation">
|
|
||||||
<meta name="keywords" content="Libavutil Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">2 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">3 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The libavutil library is a utility library to aid portable
|
|
||||||
multimedia programming. It contains safe portable string functions,
|
|
||||||
random number generators, data structures, additional mathematics
|
|
||||||
functions, cryptography and multimedia related functionality (like
|
|
||||||
enumerations for pixel and sample formats). It is not a library for
|
|
||||||
code needed by both libavcodec and libavformat.
|
|
||||||
</p>
|
|
||||||
<p>The goals for this library is to be:
|
|
||||||
</p>
|
|
||||||
<dl class="table">
|
|
||||||
<dt><strong class="strong">Modular</strong></dt>
|
|
||||||
<dd><p>It should have few interdependencies and the possibility of disabling individual
|
|
||||||
parts during <code class="command">./configure</code>.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><strong class="strong">Small</strong></dt>
|
|
||||||
<dd><p>Both sources and objects should be small.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><strong class="strong">Efficient</strong></dt>
|
|
||||||
<dd><p>It should have low CPU and memory usage.
|
|
||||||
</p>
|
|
||||||
</dd>
|
|
||||||
<dt><strong class="strong">Useful</strong></dt>
|
|
||||||
<dd><p>It should avoid useless features that almost no one needs.
|
|
||||||
</p></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">2 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="ffmpeg-utils.html">ffmpeg-utils</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">3 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,105 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Libswresample Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Libswresample Documentation">
|
|
||||||
<meta name="keywords" content="Libswresample Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.mark-bullet {list-style-type: disc}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">2 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">3 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The libswresample library performs highly optimized audio resampling,
|
|
||||||
rematrixing and sample format conversion operations.
|
|
||||||
</p>
|
|
||||||
<p>Specifically, this library performs the following conversions:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li><em class="emph">Resampling</em>: is the process of changing the audio rate, for
|
|
||||||
example from a high sample rate of 44100Hz to 8000Hz. Audio
|
|
||||||
conversion from high to low sample rate is a lossy process. Several
|
|
||||||
resampling options and algorithms are available.
|
|
||||||
|
|
||||||
</li><li><em class="emph">Format conversion</em>: is the process of converting the type of
|
|
||||||
samples, for example from 16-bit signed samples to unsigned 8-bit or
|
|
||||||
float samples. It also handles packing conversion, when passing from
|
|
||||||
packed layout (all samples belonging to distinct channels interleaved
|
|
||||||
in the same buffer), to planar layout (all samples belonging to the
|
|
||||||
same channel stored in a dedicated buffer or "plane").
|
|
||||||
|
|
||||||
</li><li><em class="emph">Rematrixing</em>: is the process of changing the channel layout, for
|
|
||||||
example from stereo to mono. When the input channels cannot be mapped
|
|
||||||
to the output streams, the process is lossy, since it involves
|
|
||||||
different gain factors and mixing.
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<p>Various other audio conversions (e.g. stretching and padding) are
|
|
||||||
enabled through dedicated options.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">2 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="ffmpeg-resampler.html">ffmpeg-resampler</a>,
|
|
||||||
<a class="url" href="libavutil.html">libavutil</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">3 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,99 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Libswscale Documentation</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Libswscale Documentation">
|
|
||||||
<meta name="keywords" content="Libswscale Documentation">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.mark-bullet {list-style-type: disc}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-See-Also" href="#See-Also">2 See Also</a></li>
|
|
||||||
<li><a id="toc-Authors" href="#Authors">3 Authors</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
|
|
||||||
<p>The libswscale library performs highly optimized image scaling and
|
|
||||||
colorspace and pixel format conversion operations.
|
|
||||||
</p>
|
|
||||||
<p>Specifically, this library performs the following conversions:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li><em class="emph">Rescaling</em>: is the process of changing the video size. Several
|
|
||||||
rescaling options and algorithms are available. This is usually a
|
|
||||||
lossy process.
|
|
||||||
|
|
||||||
</li><li><em class="emph">Pixel format conversion</em>: is the process of converting the image
|
|
||||||
format and colorspace of the image, for example from planar YUV420P to
|
|
||||||
RGB24 packed. It also handles packing conversion, that is converts
|
|
||||||
from packed layout (all pixels belonging to distinct planes
|
|
||||||
interleaved in the same buffer), to planar layout (all samples
|
|
||||||
belonging to the same plane stored in a dedicated buffer or "plane").
|
|
||||||
|
|
||||||
<p>This is usually a lossy process in case the source and destination
|
|
||||||
colorspaces differ.
|
|
||||||
</p></li></ul>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="See-Also">
|
|
||||||
<h2 class="chapter">2 See Also</h2>
|
|
||||||
|
|
||||||
<p><a class="url" href="ffmpeg.html">ffmpeg</a>, <a class="url" href="ffplay.html">ffplay</a>, <a class="url" href="ffprobe.html">ffprobe</a>,
|
|
||||||
<a class="url" href="ffmpeg-scaler.html">ffmpeg-scaler</a>,
|
|
||||||
<a class="url" href="libavutil.html">libavutil</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Authors">
|
|
||||||
<h2 class="chapter">3 Authors</h2>
|
|
||||||
|
|
||||||
<p>The FFmpeg developers.
|
|
||||||
</p>
|
|
||||||
<p>For details about the authorship, see the Git history of the project
|
|
||||||
(https://git.ffmpeg.org/ffmpeg), e.g. by typing the command
|
|
||||||
<code class="command">git log</code> in the FFmpeg source directory, or browsing the
|
|
||||||
online repository at <a class="url" href="https://git.ffmpeg.org/ffmpeg">https://git.ffmpeg.org/ffmpeg</a>.
|
|
||||||
</p>
|
|
||||||
<p>Maintainers for the specific components are listed in the file
|
|
||||||
<samp class="file">MAINTAINERS</samp> in the source code tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,524 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>FFmpeg Mailing List FAQ</title>
|
|
||||||
|
|
||||||
<meta name="description" content="FFmpeg Mailing List FAQ">
|
|
||||||
<meta name="keywords" content="FFmpeg Mailing List FAQ">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
ul.mark-bullet {list-style-type: disc}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-General-Questions" href="#General-Questions">1 General Questions</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-What-is-a-mailing-list_003f" href="#What-is-a-mailing-list_003f">1.1 What is a mailing list?</a></li>
|
|
||||||
<li><a id="toc-What-type-of-questions-can-I-ask_003f" href="#What-type-of-questions-can-I-ask_003f">1.2 What type of questions can I ask?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f-1" href="#How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f-1">1.3 How do I ask a question or send a message to a mailing list?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Subscribing-_002f-Unsubscribing" href="#Subscribing-_002f-Unsubscribing">2 Subscribing / Unsubscribing</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-How-do-I-subscribe_003f-1" href="#How-do-I-subscribe_003f-1">2.1 How do I subscribe?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-unsubscribe_003f" href="#How-do-I-unsubscribe_003f">2.2 How do I unsubscribe?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Moderation-Queue" href="#Moderation-Queue">3 Moderation Queue</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Why-is-my-message-awaiting-moderator-approval_003f-1" href="#Why-is-my-message-awaiting-moderator-approval_003f-1">3.1 Why is my message awaiting moderator approval?</a></li>
|
|
||||||
<li><a id="toc-How-long-does-it-take-for-my-message-in-the-moderation-queue-to-be-approved_003f" href="#How-long-does-it-take-for-my-message-in-the-moderation-queue-to-be-approved_003f">3.2 How long does it take for my message in the moderation queue to be approved?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-delete-my-message-in-the-moderation-queue_003f-1" href="#How-do-I-delete-my-message-in-the-moderation-queue_003f-1">3.3 How do I delete my message in the moderation queue?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Archives" href="#Archives">4 Archives</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Where-are-the-archives_003f-1" href="#Where-are-the-archives_003f-1">4.1 Where are the archives?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-reply-to-a-message-in-the-archives_003f" href="#How-do-I-reply-to-a-message-in-the-archives_003f">4.2 How do I reply to a message in the archives?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-search-the-archives_003f" href="#How-do-I-search-the-archives_003f">4.3 How do I search the archives?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Other" href="#Other">5 Other</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Is-there-an-alternative-to-the-mailing-list_003f" href="#Is-there-an-alternative-to-the-mailing-list_003f">5.1 Is there an alternative to the mailing list?</a></li>
|
|
||||||
<li><a id="toc-What-is-top_002dposting_003f-1" href="#What-is-top_002dposting_003f-1">5.2 What is top-posting?</a></li>
|
|
||||||
<li><a id="toc-What-is-the-message-size-limit_003f-1" href="#What-is-the-message-size-limit_003f-1">5.3 What is the message size limit?</a></li>
|
|
||||||
<li><a id="toc-Where-can-I-upload-sample-files_003f" href="#Where-can-I-upload-sample-files_003f">5.4 Where can I upload sample files?</a></li>
|
|
||||||
<li><a id="toc-Will-I-receive-spam-if-I-send-and_002for-subscribe-to-a-mailing-list_003f" href="#Will-I-receive-spam-if-I-send-and_002for-subscribe-to-a-mailing-list_003f">5.5 Will I receive spam if I send and/or subscribe to a mailing list?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-filter-mailing-list-messages_003f" href="#How-do-I-filter-mailing-list-messages_003f">5.6 How do I filter mailing list messages?</a></li>
|
|
||||||
<li><a id="toc-How-do-I-disable-mail-delivery-without-unsubscribing_003f-1" href="#How-do-I-disable-mail-delivery-without-unsubscribing_003f-1">5.7 How do I disable mail delivery without unsubscribing?</a></li>
|
|
||||||
<li><a id="toc-Why-is-the-mailing-list-munging-my-address_003f-1" href="#Why-is-the-mailing-list-munging-my-address_003f-1">5.8 Why is the mailing list munging my address?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Rules-and-Etiquette" href="#Rules-and-Etiquette">6 Rules and Etiquette</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-What-are-the-rules-and-the-proper-etiquette_003f" href="#What-are-the-rules-and-the-proper-etiquette_003f">6.1 What are the rules and the proper etiquette?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Help" href="#Help">7 Help</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Why-am-I-not-receiving-any-messages_003f" href="#Why-am-I-not-receiving-any-messages_003f">7.1 Why am I not receiving any messages?</a></li>
|
|
||||||
<li><a id="toc-Why-are-my-sent-messages-not-showing-up_003f" href="#Why-are-my-sent-messages-not-showing-up_003f">7.2 Why are my sent messages not showing up?</a></li>
|
|
||||||
<li><a id="toc-Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f-1" href="#Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f-1">7.3 Why do I keep getting unsubscribed from ffmpeg-devel?</a></li>
|
|
||||||
<li><a id="toc-Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f-1" href="#Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f-1">7.4 Who do I contact if I have a problem with the mailing list?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="General-Questions">
|
|
||||||
<h2 class="chapter">1 General Questions</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#What-is-a-mailing-list_003f" accesskey="1">What is a mailing list?</a></li>
|
|
||||||
<li><a href="#What-type-of-questions-can-I-ask_003f" accesskey="2">What type of questions can I ask?</a></li>
|
|
||||||
<li><a href="#How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f-1" accesskey="3">How do I ask a question or send a message to a mailing list?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="What-is-a-mailing-list_003f">
|
|
||||||
<h3 class="section">1.1 What is a mailing list?</h3>
|
|
||||||
|
|
||||||
<p>A mailing list is not much different than emailing someone, but the
|
|
||||||
main difference is that your message is received by everyone who
|
|
||||||
subscribes to the list. It is somewhat like a forum but in email form.
|
|
||||||
</p>
|
|
||||||
<p>See the <a class="url" href="https://lists.ffmpeg.org/pipermail/ffmpeg-user/">ffmpeg-user archives</a>
|
|
||||||
for examples.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="What-type-of-questions-can-I-ask_003f">
|
|
||||||
<h3 class="section">1.2 What type of questions can I ask?</h3>
|
|
||||||
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li><a class="url" href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/">ffmpeg-user</a>:
|
|
||||||
For questions involving unscripted usage or compilation of the FFmpeg
|
|
||||||
command-line tools (<code class="command">ffmpeg</code>, <code class="command">ffprobe</code>, <code class="command">ffplay</code>).
|
|
||||||
|
|
||||||
</li><li><a class="url" href="https://lists.ffmpeg.org/mailman/listinfo/libav-user/">libav-user</a>:
|
|
||||||
For questions involving the FFmpeg libav* libraries (libavcodec,
|
|
||||||
libavformat, libavfilter, etc).
|
|
||||||
|
|
||||||
</li><li><a class="url" href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel/">ffmpeg-devel</a>:
|
|
||||||
For discussions involving the development of FFmpeg and for submitting
|
|
||||||
patches. User questions should be asked at ffmpeg-user or libav-user.
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<p>To report a bug see <a class="url" href="https://ffmpeg.org/bugreports.html">https://ffmpeg.org/bugreports.html</a>.
|
|
||||||
</p>
|
|
||||||
<p>We cannot provide help for scripts and/or third-party tools.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f"></a></div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-ask-a-question-or-send-a-message-to-a-mailing-list_003f-1">
|
|
||||||
<h3 class="section">1.3 How do I ask a question or send a message to a mailing list?</h3>
|
|
||||||
|
|
||||||
<p>First you must <a class="ref" href="#How-do-I-subscribe_003f">subscribe</a>. Then all you have to do is
|
|
||||||
send an email:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>Email <a class="email" href="mailto:ffmpeg-user@ffmpeg.org">ffmpeg-user@ffmpeg.org</a> to send a message to the
|
|
||||||
ffmpeg-user mailing list.
|
|
||||||
|
|
||||||
</li><li>Email <a class="email" href="mailto:libav-user@ffmpeg.org">libav-user@ffmpeg.org</a> to send a message to the
|
|
||||||
libav-user mailing list.
|
|
||||||
|
|
||||||
</li><li>Email <a class="email" href="mailto:ffmpeg-devel@ffmpeg.org">ffmpeg-devel@ffmpeg.org</a> to send a message to the
|
|
||||||
ffmpeg-devel mailing list.
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Subscribing-_002f-Unsubscribing">
|
|
||||||
<h2 class="chapter">2 Subscribing / Unsubscribing</h2>
|
|
||||||
|
|
||||||
<a class="anchor" id="How-do-I-subscribe_003f"></a><ul class="mini-toc">
|
|
||||||
<li><a href="#How-do-I-subscribe_003f-1" accesskey="1">How do I subscribe?</a></li>
|
|
||||||
<li><a href="#How-do-I-unsubscribe_003f" accesskey="2">How do I unsubscribe?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="How-do-I-subscribe_003f-1">
|
|
||||||
<h3 class="section">2.1 How do I subscribe?</h3>
|
|
||||||
|
|
||||||
<p>Email <a class="email" href="mailto:ffmpeg-user-request@ffmpeg.org">ffmpeg-user-request@ffmpeg.org</a> with the subject
|
|
||||||
<em class="emph">subscribe</em>.
|
|
||||||
</p>
|
|
||||||
<p>Or visit the <a class="url" href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/">ffmpeg-user mailing list info page</a>
|
|
||||||
and refer to the <em class="emph">Subscribing to ffmpeg-user</em> section.
|
|
||||||
</p>
|
|
||||||
<p>The process is the same for the other mailing lists.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-unsubscribe_003f">
|
|
||||||
<h3 class="section">2.2 How do I unsubscribe?</h3>
|
|
||||||
|
|
||||||
<p>Email <a class="email" href="mailto:ffmpeg-user-request@ffmpeg.org">ffmpeg-user-request@ffmpeg.org</a> with subject <em class="emph">unsubscribe</em>.
|
|
||||||
</p>
|
|
||||||
<p>Or visit the <a class="url" href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/">ffmpeg-user mailing list info page</a>,
|
|
||||||
scroll to bottom of page, enter your email address in the box, and click
|
|
||||||
the <em class="emph">Unsubscribe or edit options</em> button.
|
|
||||||
</p>
|
|
||||||
<p>The process is the same for the other mailing lists.
|
|
||||||
</p>
|
|
||||||
<p>Please avoid asking a mailing list admin to unsubscribe you unless you
|
|
||||||
are absolutely unable to do so by yourself. See <a class="ref" href="#Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f">Who do I contact if I have a problem with the mailing list?</a>
|
|
||||||
</p>
|
|
||||||
<p>Note that it is possible to temporarily halt message delivery (vacation mode).
|
|
||||||
See <a class="ref" href="#How-do-I-disable-mail-delivery-without-unsubscribing_003f">How do I disable mail delivery without unsubscribing?</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Moderation-Queue">
|
|
||||||
<h2 class="chapter">3 Moderation Queue</h2>
|
|
||||||
<a class="anchor" id="Why-is-my-message-awaiting-moderator-approval_003f"></a><ul class="mini-toc">
|
|
||||||
<li><a href="#Why-is-my-message-awaiting-moderator-approval_003f-1" accesskey="1">Why is my message awaiting moderator approval?</a></li>
|
|
||||||
<li><a href="#How-long-does-it-take-for-my-message-in-the-moderation-queue-to-be-approved_003f" accesskey="2">How long does it take for my message in the moderation queue to be approved?</a></li>
|
|
||||||
<li><a href="#How-do-I-delete-my-message-in-the-moderation-queue_003f-1" accesskey="3">How do I delete my message in the moderation queue?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Why-is-my-message-awaiting-moderator-approval_003f-1">
|
|
||||||
<h3 class="section">3.1 Why is my message awaiting moderator approval?</h3>
|
|
||||||
|
|
||||||
<p>Some messages are automatically held in the <em class="emph">moderation queue</em> and
|
|
||||||
must be manually approved by a mailing list admin:
|
|
||||||
</p>
|
|
||||||
<p>These are:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>Messages that exceed the <a class="ref" href="#What-is-the-message-size-limit_003f">message size limit</a>.
|
|
||||||
|
|
||||||
</li><li>Messages from users whose accounts have been set with the <em class="emph">moderation flag</em>
|
|
||||||
(very rarely occurs, but may if a user repeatedly ignores the rules
|
|
||||||
or is abusive towards others).
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-long-does-it-take-for-my-message-in-the-moderation-queue-to-be-approved_003f">
|
|
||||||
<h3 class="section">3.2 How long does it take for my message in the moderation queue to be approved?</h3>
|
|
||||||
|
|
||||||
<p>The queue is not checked on a regular basis. You can ask on the
|
|
||||||
<code class="t">#ffmpeg-devel</code> IRC channel on Libera Chat for someone to approve your message.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="How-do-I-delete-my-message-in-the-moderation-queue_003f"></a></div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-delete-my-message-in-the-moderation-queue_003f-1">
|
|
||||||
<h3 class="section">3.3 How do I delete my message in the moderation queue?</h3>
|
|
||||||
|
|
||||||
<p>You should have received an email with the subject <em class="emph">Your message to <mailing list name> awaits moderator approval</em>.
|
|
||||||
A link is in the message that will allow you to delete your message
|
|
||||||
unless a mailing list admin already approved or rejected it.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Archives">
|
|
||||||
<h2 class="chapter">4 Archives</h2>
|
|
||||||
|
|
||||||
<a class="anchor" id="Where-are-the-archives_003f"></a><ul class="mini-toc">
|
|
||||||
<li><a href="#Where-are-the-archives_003f-1" accesskey="1">Where are the archives?</a></li>
|
|
||||||
<li><a href="#How-do-I-reply-to-a-message-in-the-archives_003f" accesskey="2">How do I reply to a message in the archives?</a></li>
|
|
||||||
<li><a href="#How-do-I-search-the-archives_003f" accesskey="3">How do I search the archives?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Where-are-the-archives_003f-1">
|
|
||||||
<h3 class="section">4.1 Where are the archives?</h3>
|
|
||||||
|
|
||||||
<p>See the <em class="emph">Archives</em> section on the <a class="url" href="https://ffmpeg.org/contact.html">FFmpeg Contact</a>
|
|
||||||
page for links to all FFmpeg mailing list archives.
|
|
||||||
</p>
|
|
||||||
<p>Note that the archives are split by month. Discussions that span
|
|
||||||
several months will be split into separate months in the archives.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-reply-to-a-message-in-the-archives_003f">
|
|
||||||
<h3 class="section">4.2 How do I reply to a message in the archives?</h3>
|
|
||||||
|
|
||||||
<p>Click the email link at the top of the message just under the subject
|
|
||||||
title. The link will provide the proper headers to keep the message
|
|
||||||
within the thread.
|
|
||||||
</p>
|
|
||||||
<p>Note that you must be subscribed to send a message to the ffmpeg-user or
|
|
||||||
libav-user mailing lists.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-search-the-archives_003f">
|
|
||||||
<h3 class="section">4.3 How do I search the archives?</h3>
|
|
||||||
|
|
||||||
<p>Perform a site search using your favorite search engine. Example:
|
|
||||||
</p>
|
|
||||||
<p><code class="t">site:lists.ffmpeg.org/pipermail/ffmpeg-user/ "search term"</code>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Other">
|
|
||||||
<h2 class="chapter">5 Other</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Is-there-an-alternative-to-the-mailing-list_003f" accesskey="1">Is there an alternative to the mailing list?</a></li>
|
|
||||||
<li><a href="#What-is-top_002dposting_003f-1" accesskey="2">What is top-posting?</a></li>
|
|
||||||
<li><a href="#What-is-the-message-size-limit_003f-1" accesskey="3">What is the message size limit?</a></li>
|
|
||||||
<li><a href="#Where-can-I-upload-sample-files_003f" accesskey="4">Where can I upload sample files?</a></li>
|
|
||||||
<li><a href="#Will-I-receive-spam-if-I-send-and_002for-subscribe-to-a-mailing-list_003f" accesskey="5">Will I receive spam if I send and/or subscribe to a mailing list?</a></li>
|
|
||||||
<li><a href="#How-do-I-filter-mailing-list-messages_003f" accesskey="6">How do I filter mailing list messages?</a></li>
|
|
||||||
<li><a href="#How-do-I-disable-mail-delivery-without-unsubscribing_003f-1" accesskey="7">How do I disable mail delivery without unsubscribing?</a></li>
|
|
||||||
<li><a href="#Why-is-the-mailing-list-munging-my-address_003f-1" accesskey="8">Why is the mailing list munging my address?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Is-there-an-alternative-to-the-mailing-list_003f">
|
|
||||||
<h3 class="section">5.1 Is there an alternative to the mailing list?</h3>
|
|
||||||
|
|
||||||
<p>You can ask for help in the official <code class="t">#ffmpeg</code> IRC channel on Libera Chat.
|
|
||||||
</p>
|
|
||||||
<p>Some users prefer the third-party <a class="url" href="http://www.ffmpeg-archive.org/">Nabble</a>
|
|
||||||
interface which presents the mailing lists in a typical forum layout.
|
|
||||||
</p>
|
|
||||||
<p>There are also numerous third-party help sites such as
|
|
||||||
<a class="url" href="https://superuser.com/tags/ffmpeg">Super User</a> and
|
|
||||||
<a class="url" href="https://www.reddit.com/r/ffmpeg/">r/ffmpeg on reddit</a>.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="What-is-top_002dposting_003f"></a></div>
|
|
||||||
<div class="section-level-extent" id="What-is-top_002dposting_003f-1">
|
|
||||||
<h3 class="section">5.2 What is top-posting?</h3>
|
|
||||||
|
|
||||||
<p>See <a class="url" href="https://en.wikipedia.org/wiki/Posting_style#Top-posting">https://en.wikipedia.org/wiki/Posting_style#Top-posting</a>.
|
|
||||||
</p>
|
|
||||||
<p>Instead, use trimmed interleaved/inline replies (<a class="url" href="https://lists.ffmpeg.org/pipermail/ffmpeg-user/2017-April/035849.html">example</a>).
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="What-is-the-message-size-limit_003f"></a></div>
|
|
||||||
<div class="section-level-extent" id="What-is-the-message-size-limit_003f-1">
|
|
||||||
<h3 class="section">5.3 What is the message size limit?</h3>
|
|
||||||
|
|
||||||
<p>The message size limit is 1000 kilobytes. Please provide links to larger files
|
|
||||||
instead of attaching them.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Where-can-I-upload-sample-files_003f">
|
|
||||||
<h3 class="section">5.4 Where can I upload sample files?</h3>
|
|
||||||
|
|
||||||
<p>Anywhere that is not too annoying for us to use.
|
|
||||||
</p>
|
|
||||||
<p>Google Drive and Dropbox are acceptable if you need a file host, and
|
|
||||||
<a class="url" href="https://0x0.st/">0x0.st</a> is good for files under 256 MiB.
|
|
||||||
</p>
|
|
||||||
<p>Small, short samples are preferred if possible.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Will-I-receive-spam-if-I-send-and_002for-subscribe-to-a-mailing-list_003f">
|
|
||||||
<h3 class="section">5.5 Will I receive spam if I send and/or subscribe to a mailing list?</h3>
|
|
||||||
|
|
||||||
<p>Highly unlikely.
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>The list of subscribed users is not public.
|
|
||||||
|
|
||||||
</li><li>Email addresses in the archives are obfuscated.
|
|
||||||
|
|
||||||
</li><li>Several unique test email accounts were utilized and none have yet
|
|
||||||
received any spam.
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<p>However, you may see a spam in the mailing lists on rare occasions:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>Spam in the moderation queue may be accidentally approved due to human
|
|
||||||
error.
|
|
||||||
|
|
||||||
</li><li>There have been a few messages from subscribed users who had their own
|
|
||||||
email addresses hacked and spam messages from (or appearing to be from)
|
|
||||||
the hacked account were sent to their contacts (a mailing list being a
|
|
||||||
contact in these cases).
|
|
||||||
|
|
||||||
</li><li>If you are subscribed to the bug tracker mailing list (ffmpeg-trac) you
|
|
||||||
may see the occasional spam as a false bug report, but we take measures
|
|
||||||
to try to prevent this.
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-filter-mailing-list-messages_003f">
|
|
||||||
<h3 class="section">5.6 How do I filter mailing list messages?</h3>
|
|
||||||
|
|
||||||
<p>Use the <em class="emph">List-Id</em>. For example, the ffmpeg-user mailing list is
|
|
||||||
<code class="t">ffmpeg-user.ffmpeg.org</code>. You can view the List-Id in the raw message
|
|
||||||
or headers.
|
|
||||||
</p>
|
|
||||||
<p>You can then filter the mailing list messages to their own folder.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="How-do-I-disable-mail-delivery-without-unsubscribing_003f"></a></div>
|
|
||||||
<div class="section-level-extent" id="How-do-I-disable-mail-delivery-without-unsubscribing_003f-1">
|
|
||||||
<h3 class="section">5.7 How do I disable mail delivery without unsubscribing?</h3>
|
|
||||||
|
|
||||||
<p>Sometimes you may want to temporarily stop receiving all mailing list
|
|
||||||
messages. This "vacation mode" is simple to do:
|
|
||||||
</p>
|
|
||||||
<ol class="enumerate">
|
|
||||||
<li> Go to the <a class="url" href="https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/">ffmpeg-user mailing list info page</a>
|
|
||||||
|
|
||||||
</li><li> Enter your email address in the box at very bottom of the page and click the
|
|
||||||
<em class="emph">Unsubscribe or edit options</em> box.
|
|
||||||
|
|
||||||
</li><li> Enter your password and click the <em class="emph">Log in</em> button.
|
|
||||||
|
|
||||||
</li><li> Look for the <em class="emph">Mail delivery</em> option. Here you can disable/enable mail
|
|
||||||
delivery. If you check <em class="emph">Set globally</em> it will apply your choice to all
|
|
||||||
other FFmpeg mailing lists you are subscribed to.
|
|
||||||
</li></ol>
|
|
||||||
|
|
||||||
<p>Alternatively, from your subscribed address, send a message to <a class="email" href="mailto:ffmpeg-user-request@ffmpeg.org">ffmpeg-user-request@ffmpeg.org</a>
|
|
||||||
with the subject <em class="emph">set delivery off</em>. To re-enable mail delivery send a
|
|
||||||
message to <a class="email" href="mailto:ffmpeg-user-request@ffmpeg.org">ffmpeg-user-request@ffmpeg.org</a> with the subject
|
|
||||||
<em class="emph">set delivery on</em>.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="Why-is-the-mailing-list-munging-my-address_003f"></a></div>
|
|
||||||
<div class="section-level-extent" id="Why-is-the-mailing-list-munging-my-address_003f-1">
|
|
||||||
<h3 class="section">5.8 Why is the mailing list munging my address?</h3>
|
|
||||||
|
|
||||||
<p>This is due to subscribers that use an email service with a DMARC reject policy
|
|
||||||
which adds difficulties to mailing list operators.
|
|
||||||
</p>
|
|
||||||
<p>The mailing list must re-write (munge) the <em class="emph">From:</em> header for such users;
|
|
||||||
otherwise their email service will reject and bounce the message resulting in
|
|
||||||
automatic unsubscribing from the mailing list.
|
|
||||||
</p>
|
|
||||||
<p>When sending a message these users will see <em class="emph">via <mailing list name></em>
|
|
||||||
added to their name and the <em class="emph">From:</em> address munged to the address of
|
|
||||||
the particular mailing list.
|
|
||||||
</p>
|
|
||||||
<p>If you want to avoid this then please use a different email service.
|
|
||||||
</p>
|
|
||||||
<p>Note that ffmpeg-devel does not apply any munging as it causes issues with
|
|
||||||
patch authorship. As a result users with an email service with a DMARC reject
|
|
||||||
policy may be automatically unsubscribed due to rejected and bounced messages.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Rules-and-Etiquette">
|
|
||||||
<h2 class="chapter">6 Rules and Etiquette</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#What-are-the-rules-and-the-proper-etiquette_003f" accesskey="1">What are the rules and the proper etiquette?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="What-are-the-rules-and-the-proper-etiquette_003f">
|
|
||||||
<h3 class="section">6.1 What are the rules and the proper etiquette?</h3>
|
|
||||||
|
|
||||||
<p>There may seem to be many things to remember, but we want to help and
|
|
||||||
following these guidelines will allow you to get answers more quickly
|
|
||||||
and help avoid getting ignored.
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>Always show your actual, unscripted <code class="command">ffmpeg</code> command and the
|
|
||||||
complete, uncut console output from your command.
|
|
||||||
|
|
||||||
</li><li>Use the most simple and minimal command that still shows the issue you
|
|
||||||
are encountering.
|
|
||||||
|
|
||||||
</li><li>Provide all necessary information so others can attempt to duplicate
|
|
||||||
your issue. This includes the actual command, complete uncut console
|
|
||||||
output, and any inputs that are required to duplicate the issue.
|
|
||||||
|
|
||||||
</li><li>Use the latest <code class="command">ffmpeg</code> build you can get. See the <a class="url" href="https://ffmpeg.org/download.html">FFmpeg Download</a>
|
|
||||||
page for links to recent builds for Linux, macOS, and Windows. Or
|
|
||||||
compile from the current git master branch.
|
|
||||||
|
|
||||||
</li><li>Avoid <a class="url" href="https://en.wikipedia.org/wiki/Posting_style#Top-posting">top-posting</a>.
|
|
||||||
Also see <a class="ref" href="#What-is-top_002dposting_003f">What is top-posting?</a>
|
|
||||||
|
|
||||||
</li><li>Avoid hijacking threads. Thread hijacking is replying to a message and
|
|
||||||
changing the subject line to something unrelated to the original thread.
|
|
||||||
Most email clients will still show the renamed message under the
|
|
||||||
original thread. This can be confusing and these types of messages are
|
|
||||||
often ignored.
|
|
||||||
|
|
||||||
</li><li>Do not send screenshots. Copy and paste console text instead of making
|
|
||||||
screenshots of the text.
|
|
||||||
|
|
||||||
</li><li>Avoid sending email disclaimers and legalese if possible as this is a
|
|
||||||
public list.
|
|
||||||
|
|
||||||
</li><li>Avoid using the <code class="code">-loglevel debug</code>, <code class="code">-loglevel quiet</code>, and
|
|
||||||
<code class="command">-hide_banner</code> options unless requested to do so.
|
|
||||||
|
|
||||||
</li><li>If you attach files avoid compressing small files. Uncompressed is
|
|
||||||
preferred.
|
|
||||||
|
|
||||||
</li><li>Please do not send HTML-only messages. The mailing list will ignore the
|
|
||||||
HTML component of your message. Most mail clients will automatically
|
|
||||||
include a text component: this is what the mailing list will use.
|
|
||||||
|
|
||||||
</li><li>Configuring your mail client to break lines after 70 or so characters is
|
|
||||||
recommended.
|
|
||||||
|
|
||||||
</li><li>Avoid sending the same message to multiple mailing lists.
|
|
||||||
|
|
||||||
</li><li>Please follow our <a class="url" href="https://ffmpeg.org/community.html#Code-of-conduct">Code of Conduct</a>.
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Help">
|
|
||||||
<h2 class="chapter">7 Help</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Why-am-I-not-receiving-any-messages_003f" accesskey="1">Why am I not receiving any messages?</a></li>
|
|
||||||
<li><a href="#Why-are-my-sent-messages-not-showing-up_003f" accesskey="2">Why are my sent messages not showing up?</a></li>
|
|
||||||
<li><a href="#Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f-1" accesskey="3">Why do I keep getting unsubscribed from ffmpeg-devel?</a></li>
|
|
||||||
<li><a href="#Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f-1" accesskey="4">Who do I contact if I have a problem with the mailing list?</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Why-am-I-not-receiving-any-messages_003f">
|
|
||||||
<h3 class="section">7.1 Why am I not receiving any messages?</h3>
|
|
||||||
|
|
||||||
<p>Some email providers have blacklists or spam filters that block or mark
|
|
||||||
the mailing list messages as false positives. Unfortunately, the user is
|
|
||||||
often not aware of this and is often out of their control.
|
|
||||||
</p>
|
|
||||||
<p>When possible we attempt to notify the provider to be removed from the
|
|
||||||
blacklists or filters.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Why-are-my-sent-messages-not-showing-up_003f">
|
|
||||||
<h3 class="section">7.2 Why are my sent messages not showing up?</h3>
|
|
||||||
|
|
||||||
<p>Excluding <a class="ref" href="#Why-is-my-message-awaiting-moderator-approval_003f">messages that are held in the moderation queue</a>
|
|
||||||
there are a few other reasons why your messages may fail to appear:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>HTML-only messages are ignored by the mailing lists. Most mail clients
|
|
||||||
automatically include a text component alongside HTML email: this is what
|
|
||||||
the mailing list will use. If it does not then consider your client to be
|
|
||||||
broken, because sending a text component along with the HTML component to
|
|
||||||
form a multi-part message is recommended by email standards.
|
|
||||||
|
|
||||||
</li><li>Check your spam folder.
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<a class="anchor" id="Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f"></a></div>
|
|
||||||
<div class="section-level-extent" id="Why-do-I-keep-getting-unsubscribed-from-ffmpeg_002ddevel_003f-1">
|
|
||||||
<h3 class="section">7.3 Why do I keep getting unsubscribed from ffmpeg-devel?</h3>
|
|
||||||
|
|
||||||
<p>Users with an email service that has a DMARC reject or quarantine policy may be
|
|
||||||
automatically unsubscribed from the ffmpeg-devel mailing list due to the mailing
|
|
||||||
list messages being continuously rejected and bounced back.
|
|
||||||
</p>
|
|
||||||
<p>Consider using a different email service.
|
|
||||||
</p>
|
|
||||||
<a class="anchor" id="Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f"></a></div>
|
|
||||||
<div class="section-level-extent" id="Who-do-I-contact-if-I-have-a-problem-with-the-mailing-list_003f-1">
|
|
||||||
<h3 class="section">7.4 Who do I contact if I have a problem with the mailing list?</h3>
|
|
||||||
|
|
||||||
<p>Send a message to <a class="email" href="mailto:ffmpeg-user-owner@ffmpeg.org">ffmpeg-user-owner@ffmpeg.org</a>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,244 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>NUT</title>
|
|
||||||
|
|
||||||
<meta name="description" content="NUT">
|
|
||||||
<meta name="keywords" content="NUT">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
div.example {margin-left: 3.2em}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Description" href="#Description">1 Description</a></li>
|
|
||||||
<li><a id="toc-Modes" href="#Modes">2 Modes</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-BROADCAST" href="#BROADCAST">2.1 BROADCAST</a></li>
|
|
||||||
<li><a id="toc-PIPE" href="#PIPE">2.2 PIPE</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Container_002dspecific-codec-tags" href="#Container_002dspecific-codec-tags">3 Container-specific codec tags</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Generic-raw-YUVA-formats" href="#Generic-raw-YUVA-formats">3.1 Generic raw YUVA formats</a></li>
|
|
||||||
<li><a id="toc-Raw-Audio" href="#Raw-Audio">3.2 Raw Audio</a></li>
|
|
||||||
<li><a id="toc-Subtitles" href="#Subtitles">3.3 Subtitles</a></li>
|
|
||||||
<li><a id="toc-Raw-Data" href="#Raw-Data">3.4 Raw Data</a></li>
|
|
||||||
<li><a id="toc-Codecs" href="#Codecs">3.5 Codecs</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Description">
|
|
||||||
<h2 class="chapter">1 Description</h2>
|
|
||||||
<p>NUT is a low overhead generic container format. It stores audio, video,
|
|
||||||
subtitle and user-defined streams in a simple, yet efficient, way.
|
|
||||||
</p>
|
|
||||||
<p>It was created by a group of FFmpeg and MPlayer developers in 2003
|
|
||||||
and was finalized in 2008.
|
|
||||||
</p>
|
|
||||||
<p>The official nut specification is at svn://svn.mplayerhq.hu/nut
|
|
||||||
In case of any differences between this text and the official specification,
|
|
||||||
the official specification shall prevail.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Modes">
|
|
||||||
<h2 class="chapter">2 Modes</h2>
|
|
||||||
<p>NUT has some variants signaled by using the flags field in its main header.
|
|
||||||
</p>
|
|
||||||
<table class="multitable">
|
|
||||||
<tbody><tr><td width="40%">BROADCAST</td><td width="40%">Extend the syncpoint to report the sender wallclock</td></tr>
|
|
||||||
<tr><td width="40%">PIPE</td><td width="40%">Omit completely the syncpoint</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#BROADCAST" accesskey="1">BROADCAST</a></li>
|
|
||||||
<li><a href="#PIPE" accesskey="2">PIPE</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="BROADCAST">
|
|
||||||
<h3 class="section">2.1 BROADCAST</h3>
|
|
||||||
|
|
||||||
<p>The BROADCAST variant provides a secondary time reference to facilitate
|
|
||||||
detecting endpoint latency and network delays.
|
|
||||||
It assumes all the endpoint clocks are synchronized.
|
|
||||||
To be used in real-time scenarios.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="PIPE">
|
|
||||||
<h3 class="section">2.2 PIPE</h3>
|
|
||||||
|
|
||||||
<p>The PIPE variant assumes NUT is used as non-seekable intermediate container,
|
|
||||||
by not using syncpoint removes unneeded overhead and reduces the overall
|
|
||||||
memory usage.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Container_002dspecific-codec-tags">
|
|
||||||
<h2 class="chapter">3 Container-specific codec tags</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Generic-raw-YUVA-formats" accesskey="1">Generic raw YUVA formats</a></li>
|
|
||||||
<li><a href="#Raw-Audio" accesskey="2">Raw Audio</a></li>
|
|
||||||
<li><a href="#Subtitles" accesskey="3">Subtitles</a></li>
|
|
||||||
<li><a href="#Raw-Data" accesskey="4">Raw Data</a></li>
|
|
||||||
<li><a href="#Codecs" accesskey="5">Codecs</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Generic-raw-YUVA-formats">
|
|
||||||
<h3 class="section">3.1 Generic raw YUVA formats</h3>
|
|
||||||
|
|
||||||
<p>Since many exotic planar YUVA pixel formats are not considered by
|
|
||||||
the AVI/QuickTime FourCC lists, the following scheme is adopted for
|
|
||||||
representing them.
|
|
||||||
</p>
|
|
||||||
<p>The first two bytes can contain the values:
|
|
||||||
Y1 = only Y
|
|
||||||
Y2 = Y+A
|
|
||||||
Y3 = YUV
|
|
||||||
Y4 = YUVA
|
|
||||||
</p>
|
|
||||||
<p>The third byte represents the width and height chroma subsampling
|
|
||||||
values for the UV planes, that is the amount to shift the luma
|
|
||||||
width/height right to find the chroma width/height.
|
|
||||||
</p>
|
|
||||||
<p>The fourth byte is the number of bits used (8, 16, ...).
|
|
||||||
</p>
|
|
||||||
<p>If the order of bytes is inverted, that means that each component has
|
|
||||||
to be read big-endian.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Raw-Audio">
|
|
||||||
<h3 class="section">3.2 Raw Audio</h3>
|
|
||||||
|
|
||||||
<table class="multitable">
|
|
||||||
<tbody><tr><td width="40%">ALAW</td><td width="40%">A-LAW</td></tr>
|
|
||||||
<tr><td width="40%">ULAW</td><td width="40%">MU-LAW</td></tr>
|
|
||||||
<tr><td width="40%">P<type><interleaving><bits></td><td width="40%">little-endian PCM</td></tr>
|
|
||||||
<tr><td width="40%"><bits><interleaving><type>P</td><td width="40%">big-endian PCM</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p><type> is S for signed integer, U for unsigned integer, F for IEEE float
|
|
||||||
<interleaving> is D for default, P is for planar.
|
|
||||||
<bits> is 8/16/24/32
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">PFD[32] would for example be signed 32 bit little-endian IEEE float
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Subtitles">
|
|
||||||
<h3 class="section">3.3 Subtitles</h3>
|
|
||||||
|
|
||||||
<table class="multitable">
|
|
||||||
<tbody><tr><td width="40%">UTF8</td><td width="40%">Raw UTF-8</td></tr>
|
|
||||||
<tr><td width="40%">SSA[0]</td><td width="40%">SubStation Alpha</td></tr>
|
|
||||||
<tr><td width="40%">DVDS</td><td width="40%">DVD subtitles</td></tr>
|
|
||||||
<tr><td width="40%">DVBS</td><td width="40%">DVB subtitles</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Raw-Data">
|
|
||||||
<h3 class="section">3.4 Raw Data</h3>
|
|
||||||
|
|
||||||
<table class="multitable">
|
|
||||||
<tbody><tr><td width="40%">UTF8</td><td width="40%">Raw UTF-8</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Codecs">
|
|
||||||
<h3 class="section">3.5 Codecs</h3>
|
|
||||||
|
|
||||||
<table class="multitable">
|
|
||||||
<tbody><tr><td width="40%">3IV1</td><td width="40%">non-compliant MPEG-4 generated by old 3ivx</td></tr>
|
|
||||||
<tr><td width="40%">ASV1</td><td width="40%">Asus Video</td></tr>
|
|
||||||
<tr><td width="40%">ASV2</td><td width="40%">Asus Video 2</td></tr>
|
|
||||||
<tr><td width="40%">CVID</td><td width="40%">Cinepak</td></tr>
|
|
||||||
<tr><td width="40%">CYUV</td><td width="40%">Creative YUV</td></tr>
|
|
||||||
<tr><td width="40%">DIVX</td><td width="40%">non-compliant MPEG-4 generated by old DivX</td></tr>
|
|
||||||
<tr><td width="40%">DUCK</td><td width="40%">Truemotion 1</td></tr>
|
|
||||||
<tr><td width="40%">FFV1</td><td width="40%">FFmpeg video 1</td></tr>
|
|
||||||
<tr><td width="40%">FFVH</td><td width="40%">FFmpeg Huffyuv</td></tr>
|
|
||||||
<tr><td width="40%">H261</td><td width="40%">ITU H.261</td></tr>
|
|
||||||
<tr><td width="40%">H262</td><td width="40%">ITU H.262</td></tr>
|
|
||||||
<tr><td width="40%">H263</td><td width="40%">ITU H.263</td></tr>
|
|
||||||
<tr><td width="40%">H264</td><td width="40%">ITU H.264</td></tr>
|
|
||||||
<tr><td width="40%">HFYU</td><td width="40%">Huffyuv</td></tr>
|
|
||||||
<tr><td width="40%">I263</td><td width="40%">Intel H.263</td></tr>
|
|
||||||
<tr><td width="40%">IV31</td><td width="40%">Indeo 3.1</td></tr>
|
|
||||||
<tr><td width="40%">IV32</td><td width="40%">Indeo 3.2</td></tr>
|
|
||||||
<tr><td width="40%">IV50</td><td width="40%">Indeo 5.0</td></tr>
|
|
||||||
<tr><td width="40%">LJPG</td><td width="40%">ITU JPEG (lossless)</td></tr>
|
|
||||||
<tr><td width="40%">MJLS</td><td width="40%">ITU JPEG-LS</td></tr>
|
|
||||||
<tr><td width="40%">MJPG</td><td width="40%">ITU JPEG</td></tr>
|
|
||||||
<tr><td width="40%">MPG4</td><td width="40%">MS MPEG-4v1 (not ISO MPEG-4)</td></tr>
|
|
||||||
<tr><td width="40%">MP42</td><td width="40%">MS MPEG-4v2</td></tr>
|
|
||||||
<tr><td width="40%">MP43</td><td width="40%">MS MPEG-4v3</td></tr>
|
|
||||||
<tr><td width="40%">MP4V</td><td width="40%">ISO MPEG-4 Part 2 Video (from old encoders)</td></tr>
|
|
||||||
<tr><td width="40%">mpg1</td><td width="40%">ISO MPEG-1 Video</td></tr>
|
|
||||||
<tr><td width="40%">mpg2</td><td width="40%">ISO MPEG-2 Video</td></tr>
|
|
||||||
<tr><td width="40%">MRLE</td><td width="40%">MS RLE</td></tr>
|
|
||||||
<tr><td width="40%">MSVC</td><td width="40%">MS Video 1</td></tr>
|
|
||||||
<tr><td width="40%">RT21</td><td width="40%">Indeo 2.1</td></tr>
|
|
||||||
<tr><td width="40%">RV10</td><td width="40%">RealVideo 1.0</td></tr>
|
|
||||||
<tr><td width="40%">RV20</td><td width="40%">RealVideo 2.0</td></tr>
|
|
||||||
<tr><td width="40%">RV30</td><td width="40%">RealVideo 3.0</td></tr>
|
|
||||||
<tr><td width="40%">RV40</td><td width="40%">RealVideo 4.0</td></tr>
|
|
||||||
<tr><td width="40%">SNOW</td><td width="40%">FFmpeg Snow</td></tr>
|
|
||||||
<tr><td width="40%">SVQ1</td><td width="40%">Sorenson Video 1</td></tr>
|
|
||||||
<tr><td width="40%">SVQ3</td><td width="40%">Sorenson Video 3</td></tr>
|
|
||||||
<tr><td width="40%">theo</td><td width="40%">Xiph Theora</td></tr>
|
|
||||||
<tr><td width="40%">TM20</td><td width="40%">Truemotion 2.0</td></tr>
|
|
||||||
<tr><td width="40%">UMP4</td><td width="40%">non-compliant MPEG-4 generated by UB Video MPEG-4</td></tr>
|
|
||||||
<tr><td width="40%">VCR1</td><td width="40%">ATI VCR1</td></tr>
|
|
||||||
<tr><td width="40%">VP30</td><td width="40%">VP 3.0</td></tr>
|
|
||||||
<tr><td width="40%">VP31</td><td width="40%">VP 3.1</td></tr>
|
|
||||||
<tr><td width="40%">VP50</td><td width="40%">VP 5.0</td></tr>
|
|
||||||
<tr><td width="40%">VP60</td><td width="40%">VP 6.0</td></tr>
|
|
||||||
<tr><td width="40%">VP61</td><td width="40%">VP 6.1</td></tr>
|
|
||||||
<tr><td width="40%">VP62</td><td width="40%">VP 6.2</td></tr>
|
|
||||||
<tr><td width="40%">VP70</td><td width="40%">VP 7.0</td></tr>
|
|
||||||
<tr><td width="40%">WMV1</td><td width="40%">MS WMV7</td></tr>
|
|
||||||
<tr><td width="40%">WMV2</td><td width="40%">MS WMV8</td></tr>
|
|
||||||
<tr><td width="40%">WMV3</td><td width="40%">MS WMV9</td></tr>
|
|
||||||
<tr><td width="40%">WV1F</td><td width="40%">non-compliant MPEG-4 generated by ?</td></tr>
|
|
||||||
<tr><td width="40%">WVC1</td><td width="40%">VC-1</td></tr>
|
|
||||||
<tr><td width="40%">XVID</td><td width="40%">non-compliant MPEG-4 generated by old Xvid</td></tr>
|
|
||||||
<tr><td width="40%">XVIX</td><td width="40%">non-compliant MPEG-4 generated by old Xvid with interlacing bug</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,434 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<!-- Created by GNU Texinfo 7.0.1, https://www.gnu.org/software/texinfo/ -->
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>Platform Specific Information</title>
|
|
||||||
|
|
||||||
<meta name="description" content="Platform Specific Information">
|
|
||||||
<meta name="keywords" content="Platform Specific Information">
|
|
||||||
<meta name="resource-type" content="document">
|
|
||||||
<meta name="distribution" content="global">
|
|
||||||
<meta name="Generator" content="makeinfo">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
||||||
|
|
||||||
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
|
||||||
<style type="text/css">
|
|
||||||
<!--
|
|
||||||
div.example {margin-left: 3.2em}
|
|
||||||
ul.mark-bullet {list-style-type: disc}
|
|
||||||
ul.toc-numbered-mark {list-style: none}
|
|
||||||
-->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body lang="en">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="top-level-extent" id="SEC_Top">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="element-contents" id="SEC_Contents">
|
|
||||||
<h2 class="contents-heading">Table of Contents</h2>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Unix_002dlike" href="#Unix_002dlike">1 Unix-like</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Advanced-linking-configuration" href="#Advanced-linking-configuration">1.1 Advanced linking configuration</a></li>
|
|
||||||
<li><a id="toc-BSD" href="#BSD">1.2 BSD</a></li>
|
|
||||||
<li><a id="toc-_0028Open_0029Solaris" href="#g_t_0028Open_0029Solaris">1.3 (Open)Solaris</a></li>
|
|
||||||
<li><a id="toc-Darwin-_0028Mac-OS-X_002c-iPhone_0029" href="#Darwin-_0028Mac-OS-X_002c-iPhone_0029">1.4 Darwin (Mac OS X, iPhone)</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-DOS" href="#DOS">2 DOS</a></li>
|
|
||||||
<li><a id="toc-OS_002f2" href="#OS_002f2">3 OS/2</a></li>
|
|
||||||
<li><a id="toc-Windows" href="#Windows">4 Windows</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Native-Windows-compilation-using-MinGW-or-MinGW_002dw64" href="#Native-Windows-compilation-using-MinGW-or-MinGW_002dw64">4.1 Native Windows compilation using MinGW or MinGW-w64</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Native-Windows-compilation-using-MSYS2" href="#Native-Windows-compilation-using-MSYS2">4.1.1 Native Windows compilation using MSYS2</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows" href="#Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows">4.2 Microsoft Visual C++ or Intel C++ Compiler for Windows</a>
|
|
||||||
<ul class="toc-numbered-mark">
|
|
||||||
<li><a id="toc-Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b" href="#Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b">4.2.1 Linking to FFmpeg with Microsoft Visual C++</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a id="toc-Cross-compilation-for-Windows-with-Linux-1" href="#Cross-compilation-for-Windows-with-Linux-1">4.3 Cross compilation for Windows with Linux</a></li>
|
|
||||||
<li><a id="toc-Compilation-under-Cygwin" href="#Compilation-under-Cygwin">4.4 Compilation under Cygwin</a></li>
|
|
||||||
<li><a id="toc-Crosscompilation-for-Windows-under-Cygwin" href="#Crosscompilation-for-Windows-under-Cygwin">4.5 Crosscompilation for Windows under Cygwin</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Unix_002dlike">
|
|
||||||
<h2 class="chapter">1 Unix-like</h2>
|
|
||||||
|
|
||||||
<p>Some parts of FFmpeg cannot be built with version 2.15 of the GNU
|
|
||||||
assembler which is still provided by a few AMD64 distributions. To
|
|
||||||
make sure your compiler really uses the required version of gas
|
|
||||||
after a binutils upgrade, run:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">$(gcc -print-prog-name=as) --version
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If not, then you should install a different compiler that has no
|
|
||||||
hard-coded path to gas. In the worst case pass <code class="code">--disable-asm</code>
|
|
||||||
to configure.
|
|
||||||
</p>
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Advanced-linking-configuration" accesskey="1">Advanced linking configuration</a></li>
|
|
||||||
<li><a href="#BSD" accesskey="2">BSD</a></li>
|
|
||||||
<li><a href="#g_t_0028Open_0029Solaris" accesskey="3">(Open)Solaris</a></li>
|
|
||||||
<li><a href="#Darwin-_0028Mac-OS-X_002c-iPhone_0029" accesskey="4">Darwin (Mac OS X, iPhone)</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Advanced-linking-configuration">
|
|
||||||
<h3 class="section">1.1 Advanced linking configuration</h3>
|
|
||||||
|
|
||||||
<p>If you compiled FFmpeg libraries statically and you want to use them to
|
|
||||||
build your own shared library, you may need to force PIC support (with
|
|
||||||
<code class="code">--enable-pic</code> during FFmpeg configure) and add the following option
|
|
||||||
to your project LDFLAGS:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">-Wl,-Bsymbolic
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If your target platform requires position independent binaries, you should
|
|
||||||
pass the correct linking flag (e.g. <code class="code">-pie</code>) to <code class="code">--extra-ldexeflags</code>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="BSD">
|
|
||||||
<h3 class="section">1.2 BSD</h3>
|
|
||||||
|
|
||||||
<p>BSD make will not build FFmpeg, you need to install and use GNU Make
|
|
||||||
(<code class="command">gmake</code>).
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="g_t_0028Open_0029Solaris">
|
|
||||||
<h3 class="section">1.3 (Open)Solaris</h3>
|
|
||||||
|
|
||||||
<p>GNU Make is required to build FFmpeg, so you have to invoke (<code class="command">gmake</code>),
|
|
||||||
standard Solaris Make will not work. When building with a non-c99 front-end
|
|
||||||
(gcc, generic suncc) add either <code class="code">--extra-libs=/usr/lib/values-xpg6.o</code>
|
|
||||||
or <code class="code">--extra-libs=/usr/lib/64/values-xpg6.o</code> to the configure options
|
|
||||||
since the libc is not c99-compliant by default. The probes performed by
|
|
||||||
configure may raise an exception leading to the death of configure itself
|
|
||||||
due to a bug in the system shell. Simply invoke a different shell such as
|
|
||||||
bash directly to work around this:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">bash ./configure
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<a class="anchor" id="Darwin"></a></div>
|
|
||||||
<div class="section-level-extent" id="Darwin-_0028Mac-OS-X_002c-iPhone_0029">
|
|
||||||
<h3 class="section">1.4 Darwin (Mac OS X, iPhone)</h3>
|
|
||||||
|
|
||||||
<p>The toolchain provided with Xcode is sufficient to build the basic
|
|
||||||
unaccelerated code.
|
|
||||||
</p>
|
|
||||||
<p>Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from
|
|
||||||
<a class="url" href="https://github.com/FFmpeg/gas-preprocessor">https://github.com/FFmpeg/gas-preprocessor</a> or
|
|
||||||
<a class="url" href="https://github.com/yuvi/gas-preprocessor">https://github.com/yuvi/gas-preprocessor</a>(currently outdated) to build the optimized
|
|
||||||
assembly functions. Put the Perl script somewhere
|
|
||||||
in your PATH, FFmpeg’s configure will pick it up automatically.
|
|
||||||
</p>
|
|
||||||
<p>Mac OS X on amd64 and x86 requires <code class="command">nasm</code> to build most of the
|
|
||||||
optimized assembly functions. <a class="uref" href="http://www.finkproject.org/">Fink</a>,
|
|
||||||
<a class="uref" href="https://wiki.gentoo.org/wiki/Project:Prefix">Gentoo Prefix</a>,
|
|
||||||
<a class="uref" href="https://mxcl.github.com/homebrew/">Homebrew</a>
|
|
||||||
or <a class="uref" href="http://www.macports.org">MacPorts</a> can easily provide it.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="DOS">
|
|
||||||
<h2 class="chapter">2 DOS</h2>
|
|
||||||
|
|
||||||
<p>Using a cross-compiler is preferred for various reasons.
|
|
||||||
<a class="url" href="http://www.delorie.com/howto/djgpp/linux-x-djgpp.html">http://www.delorie.com/howto/djgpp/linux-x-djgpp.html</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="OS_002f2">
|
|
||||||
<h2 class="chapter">3 OS/2</h2>
|
|
||||||
|
|
||||||
<p>For information about compiling FFmpeg on OS/2 see
|
|
||||||
<a class="url" href="http://www.edm2.com/index.php/FFmpeg">http://www.edm2.com/index.php/FFmpeg</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="chapter-level-extent" id="Windows">
|
|
||||||
<h2 class="chapter">4 Windows</h2>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Native-Windows-compilation-using-MinGW-or-MinGW_002dw64" accesskey="1">Native Windows compilation using MinGW or MinGW-w64</a></li>
|
|
||||||
<li><a href="#Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows" accesskey="2">Microsoft Visual C++ or Intel C++ Compiler for Windows</a></li>
|
|
||||||
<li><a href="#Cross-compilation-for-Windows-with-Linux-1" accesskey="3">Cross compilation for Windows with Linux</a></li>
|
|
||||||
<li><a href="#Compilation-under-Cygwin" accesskey="4">Compilation under Cygwin</a></li>
|
|
||||||
<li><a href="#Crosscompilation-for-Windows-under-Cygwin" accesskey="5">Crosscompilation for Windows under Cygwin</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="section-level-extent" id="Native-Windows-compilation-using-MinGW-or-MinGW_002dw64">
|
|
||||||
<h3 class="section">4.1 Native Windows compilation using MinGW or MinGW-w64</h3>
|
|
||||||
|
|
||||||
<p>FFmpeg can be built to run natively on Windows using the MinGW-w64
|
|
||||||
toolchain. Install the latest versions of MSYS2 and MinGW-w64 from
|
|
||||||
<a class="url" href="http://msys2.github.io/">http://msys2.github.io/</a> and/or <a class="url" href="http://mingw-w64.sourceforge.net/">http://mingw-w64.sourceforge.net/</a>.
|
|
||||||
You can find detailed installation instructions in the download section and
|
|
||||||
the FAQ.
|
|
||||||
</p>
|
|
||||||
<p>Notes:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>Building for the MSYS environment is discouraged, MSYS2 provides a full
|
|
||||||
MinGW-w64 environment through <samp class="file">mingw64_shell.bat</samp> or
|
|
||||||
<samp class="file">mingw32_shell.bat</samp> that should be used instead of the environment
|
|
||||||
provided by <samp class="file">msys2_shell.bat</samp>.
|
|
||||||
|
|
||||||
</li><li>Building using MSYS2 can be sped up by disabling implicit rules in the
|
|
||||||
Makefile by calling <code class="code">make -r</code> instead of plain <code class="code">make</code>. This
|
|
||||||
speed up is close to non-existent for normal one-off builds and is only
|
|
||||||
noticeable when running make for a second time (for example during
|
|
||||||
<code class="code">make install</code>).
|
|
||||||
|
|
||||||
</li><li>In order to compile FFplay, you must have the MinGW development library
|
|
||||||
of <a class="uref" href="http://www.libsdl.org/">SDL</a> and <code class="code">pkg-config</code> installed.
|
|
||||||
|
|
||||||
</li><li>By using <code class="code">./configure --enable-shared</code> when configuring FFmpeg,
|
|
||||||
you can build the FFmpeg libraries (e.g. libavutil, libavcodec,
|
|
||||||
libavformat) as DLLs.
|
|
||||||
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Native-Windows-compilation-using-MSYS2" accesskey="1">Native Windows compilation using MSYS2</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="subsection-level-extent" id="Native-Windows-compilation-using-MSYS2">
|
|
||||||
<h4 class="subsection">4.1.1 Native Windows compilation using MSYS2</h4>
|
|
||||||
|
|
||||||
<p>The MSYS2 MinGW-w64 environment provides ready to use toolchains and dependencies
|
|
||||||
through <code class="command">pacman</code>.
|
|
||||||
</p>
|
|
||||||
<p>Make sure to use <samp class="file">mingw64_shell.bat</samp> or <samp class="file">mingw32_shell.bat</samp> to have
|
|
||||||
the correct MinGW-w64 environment. The default install provides shortcuts to
|
|
||||||
them under <code class="command">MinGW-w64 Win64 Shell</code> and <code class="command">MinGW-w64 Win32 Shell</code>.
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted"># normal msys2 packages
|
|
||||||
pacman -S make pkgconf diffutils
|
|
||||||
|
|
||||||
# mingw-w64 packages and toolchains
|
|
||||||
pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>To target 32 bits replace <code class="code">x86_64</code> with <code class="code">i686</code> in the command above.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows">
|
|
||||||
<h3 class="section">4.2 Microsoft Visual C++ or Intel C++ Compiler for Windows</h3>
|
|
||||||
|
|
||||||
<p>FFmpeg can be built with MSVC 2013 or later.
|
|
||||||
</p>
|
|
||||||
<p>You will need the following prerequisites:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li><a class="uref" href="http://msys2.github.io/">MSYS2</a>
|
|
||||||
</li><li><a class="uref" href="http://www.nasm.us/">NASM</a>
|
|
||||||
(Also available via MSYS2’s package manager.)
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<p>To set up a proper environment in MSYS2, you need to run <code class="code">msys_shell.bat</code> from
|
|
||||||
the Visual Studio or Intel Compiler command prompt.
|
|
||||||
</p>
|
|
||||||
<p>Place <code class="code">yasm.exe</code> somewhere in your <code class="code">PATH</code>.
|
|
||||||
</p>
|
|
||||||
<p>Next, make sure any other headers and libs you want to use, such as zlib, are
|
|
||||||
located in a spot that the compiler can see. Do so by modifying the <code class="code">LIB</code>
|
|
||||||
and <code class="code">INCLUDE</code> environment variables to include the <strong class="strong">Windows-style</strong>
|
|
||||||
paths to these directories. Alternatively, you can try to use the
|
|
||||||
<code class="code">--extra-cflags</code>/<code class="code">--extra-ldflags</code> configure options.
|
|
||||||
</p>
|
|
||||||
<p>Finally, run:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">For MSVC:
|
|
||||||
./configure --toolchain=msvc
|
|
||||||
|
|
||||||
For ICL:
|
|
||||||
./configure --toolchain=icl
|
|
||||||
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If you wish to compile shared libraries, add <code class="code">--enable-shared</code> to your
|
|
||||||
configure options. Note that due to the way MSVC and ICL handle DLL imports and
|
|
||||||
exports, you cannot compile static and shared libraries at the same time, and
|
|
||||||
enabling shared libraries will automatically disable the static ones.
|
|
||||||
</p>
|
|
||||||
<p>Notes:
|
|
||||||
</p>
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>If you wish to build with zlib support, you will have to grab a compatible
|
|
||||||
zlib binary from somewhere, with an MSVC import lib, or if you wish to link
|
|
||||||
statically, you can follow the instructions below to build a compatible
|
|
||||||
<code class="code">zlib.lib</code> with MSVC. Regardless of which method you use, you must still
|
|
||||||
follow step 3, or compilation will fail.
|
|
||||||
<ol class="enumerate">
|
|
||||||
<li> Grab the <a class="uref" href="http://zlib.net/">zlib sources</a>.
|
|
||||||
</li><li> Edit <code class="code">win32/Makefile.msc</code> so that it uses -MT instead of -MD, since
|
|
||||||
this is how FFmpeg is built as well.
|
|
||||||
</li><li> Edit <code class="code">zconf.h</code> and remove its inclusion of <code class="code">unistd.h</code>. This gets
|
|
||||||
erroneously included when building FFmpeg.
|
|
||||||
</li><li> Run <code class="code">nmake -f win32/Makefile.msc</code>.
|
|
||||||
</li><li> Move <code class="code">zlib.lib</code>, <code class="code">zconf.h</code>, and <code class="code">zlib.h</code> to somewhere MSVC
|
|
||||||
can see.
|
|
||||||
</li></ol>
|
|
||||||
|
|
||||||
</li><li>FFmpeg has been tested with the following on i686 and x86_64:
|
|
||||||
<ul class="itemize mark-bullet">
|
|
||||||
<li>Visual Studio 2013 Pro and Express
|
|
||||||
</li><li>Intel Composer XE 2013
|
|
||||||
</li><li>Intel Composer XE 2013 SP1
|
|
||||||
</li></ul>
|
|
||||||
<p>Anything else is not officially supported.
|
|
||||||
</p>
|
|
||||||
</li></ul>
|
|
||||||
|
|
||||||
<ul class="mini-toc">
|
|
||||||
<li><a href="#Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b" accesskey="1">Linking to FFmpeg with Microsoft Visual C++</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="subsection-level-extent" id="Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b">
|
|
||||||
<h4 class="subsection">4.2.1 Linking to FFmpeg with Microsoft Visual C++</h4>
|
|
||||||
|
|
||||||
<p>If you plan to link with MSVC-built static libraries, you will need
|
|
||||||
to make sure you have <code class="code">Runtime Library</code> set to
|
|
||||||
<code class="code">Multi-threaded (/MT)</code> in your project’s settings.
|
|
||||||
</p>
|
|
||||||
<p>You will need to define <code class="code">inline</code> to something MSVC understands:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">#define inline __inline
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Also note, that as stated in <strong class="strong">Microsoft Visual C++</strong>, you will need
|
|
||||||
an MSVC-compatible <a class="uref" href="http://code.google.com/p/msinttypes/">inttypes.h</a>.
|
|
||||||
</p>
|
|
||||||
<p>If you plan on using import libraries created by dlltool, you must
|
|
||||||
set <code class="code">References</code> to <code class="code">No (/OPT:NOREF)</code> under the linker optimization
|
|
||||||
settings, otherwise the resulting binaries will fail during runtime.
|
|
||||||
This is not required when using import libraries generated by <code class="code">lib.exe</code>.
|
|
||||||
This issue is reported upstream at
|
|
||||||
<a class="url" href="http://sourceware.org/bugzilla/show_bug.cgi?id=12633">http://sourceware.org/bugzilla/show_bug.cgi?id=12633</a>.
|
|
||||||
</p>
|
|
||||||
<p>To create import libraries that work with the <code class="code">/OPT:REF</code> option
|
|
||||||
(which is enabled by default in Release mode), follow these steps:
|
|
||||||
</p>
|
|
||||||
<ol class="enumerate">
|
|
||||||
<li> Open the <em class="emph">Visual Studio Command Prompt</em>.
|
|
||||||
|
|
||||||
<p>Alternatively, in a normal command line prompt, call <samp class="file">vcvars32.bat</samp>
|
|
||||||
which sets up the environment variables for the Visual C++ tools
|
|
||||||
(the standard location for this file is something like
|
|
||||||
<samp class="file">C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat</samp>).
|
|
||||||
</p>
|
|
||||||
</li><li> Enter the <samp class="file">bin</samp> directory where the created LIB and DLL files
|
|
||||||
are stored.
|
|
||||||
|
|
||||||
</li><li> Generate new import libraries with <code class="command">lib.exe</code>:
|
|
||||||
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">lib /machine:i386 /def:..\lib\foo-version.def /out:foo.lib
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>Replace <code class="code">foo-version</code> and <code class="code">foo</code> with the respective library names.
|
|
||||||
</p>
|
|
||||||
</li></ol>
|
|
||||||
|
|
||||||
<a class="anchor" id="Cross-compilation-for-Windows-with-Linux"></a></div>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Cross-compilation-for-Windows-with-Linux-1">
|
|
||||||
<h3 class="section">4.3 Cross compilation for Windows with Linux</h3>
|
|
||||||
|
|
||||||
<p>You must use the MinGW cross compilation tools available at
|
|
||||||
<a class="url" href="http://www.mingw.org/">http://www.mingw.org/</a>.
|
|
||||||
</p>
|
|
||||||
<p>Then configure FFmpeg with the following options:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc-
|
|
||||||
</pre></div>
|
|
||||||
<p>(you can change the cross-prefix according to the prefix chosen for the
|
|
||||||
MinGW tools).
|
|
||||||
</p>
|
|
||||||
<p>Then you can easily test FFmpeg with <a class="uref" href="http://www.winehq.com/">Wine</a>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Compilation-under-Cygwin">
|
|
||||||
<h3 class="section">4.4 Compilation under Cygwin</h3>
|
|
||||||
|
|
||||||
<p>Please use Cygwin 1.7.x as the obsolete 1.5.x Cygwin versions lack
|
|
||||||
llrint() in its C library.
|
|
||||||
</p>
|
|
||||||
<p>Install your Cygwin with all the "Base" packages, plus the
|
|
||||||
following "Devel" ones:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">binutils, gcc4-core, make, git, mingw-runtime, texinfo
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>In order to run FATE you will also need the following "Utils" packages:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">diffutils
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>If you want to build FFmpeg with additional libraries, download Cygwin
|
|
||||||
"Devel" packages for Ogg and Vorbis from any Cygwin packages repository:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">libogg-devel, libvorbis-devel
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>These library packages are only available from
|
|
||||||
<a class="uref" href="http://sourceware.org/cygwinports/">Cygwin Ports</a>:
|
|
||||||
</p>
|
|
||||||
<div class="example">
|
|
||||||
<pre class="example-preformatted">yasm, libSDL-devel, libgsm-devel, libmp3lame-devel,
|
|
||||||
speex-devel, libtheora-devel, libxvidcore-devel
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>The recommendation for x264 is to build it from source, as it evolves too
|
|
||||||
quickly for Cygwin Ports to be up to date.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="section-level-extent" id="Crosscompilation-for-Windows-under-Cygwin">
|
|
||||||
<h3 class="section">4.5 Crosscompilation for Windows under Cygwin</h3>
|
|
||||||
|
|
||||||
<p>With Cygwin you can create Windows binaries that do not need the cygwin1.dll.
|
|
||||||
</p>
|
|
||||||
<p>Just install your Cygwin as explained before, plus these additional
|
|
||||||
"Devel" packages:
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">gcc-mingw-core, mingw-runtime, mingw-zlib
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>and add some special flags to your configure invocation.
|
|
||||||
</p>
|
|
||||||
<p>For a static build run
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
<p>and for a build with shared libraries
|
|
||||||
</p><div class="example">
|
|
||||||
<pre class="example-preformatted">./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin
|
|
||||||
</pre></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
23
datafiles/ffmpeg/doc/style.min.css
vendored
23
datafiles/ffmpeg/doc/style.min.css
vendored
File diff suppressed because one or more lines are too long
|
@ -1,19 +0,0 @@
|
||||||
vcodec=libvpx
|
|
||||||
|
|
||||||
g=120
|
|
||||||
lag-in-frames=16
|
|
||||||
deadline=good
|
|
||||||
cpu-used=0
|
|
||||||
vprofile=1
|
|
||||||
qmax=51
|
|
||||||
qmin=11
|
|
||||||
slices=4
|
|
||||||
b=2M
|
|
||||||
|
|
||||||
#ignored unless using -pass 2
|
|
||||||
maxrate=24M
|
|
||||||
minrate=100k
|
|
||||||
auto-alt-ref=1
|
|
||||||
arnr-maxframes=7
|
|
||||||
arnr-strength=5
|
|
||||||
arnr-type=centered
|
|
|
@ -1,19 +0,0 @@
|
||||||
vcodec=libvpx
|
|
||||||
|
|
||||||
g=120
|
|
||||||
lag-in-frames=25
|
|
||||||
deadline=good
|
|
||||||
cpu-used=0
|
|
||||||
vprofile=1
|
|
||||||
qmax=51
|
|
||||||
qmin=11
|
|
||||||
slices=4
|
|
||||||
b=2M
|
|
||||||
|
|
||||||
#ignored unless using -pass 2
|
|
||||||
maxrate=24M
|
|
||||||
minrate=100k
|
|
||||||
auto-alt-ref=1
|
|
||||||
arnr-maxframes=7
|
|
||||||
arnr-strength=5
|
|
||||||
arnr-type=centered
|
|
|
@ -1,18 +0,0 @@
|
||||||
vcodec=libvpx
|
|
||||||
|
|
||||||
g=120
|
|
||||||
lag-in-frames=16
|
|
||||||
deadline=good
|
|
||||||
cpu-used=0
|
|
||||||
vprofile=0
|
|
||||||
qmax=63
|
|
||||||
qmin=0
|
|
||||||
b=768k
|
|
||||||
|
|
||||||
#ignored unless using -pass 2
|
|
||||||
maxrate=1.5M
|
|
||||||
minrate=40k
|
|
||||||
auto-alt-ref=1
|
|
||||||
arnr-maxframes=7
|
|
||||||
arnr-strength=5
|
|
||||||
arnr-type=centered
|
|
|
@ -1,19 +0,0 @@
|
||||||
vcodec=libvpx
|
|
||||||
|
|
||||||
g=120
|
|
||||||
lag-in-frames=16
|
|
||||||
deadline=good
|
|
||||||
cpu-used=0
|
|
||||||
vprofile=0
|
|
||||||
qmax=51
|
|
||||||
qmin=11
|
|
||||||
slices=4
|
|
||||||
b=2M
|
|
||||||
|
|
||||||
#ignored unless using -pass 2
|
|
||||||
maxrate=24M
|
|
||||||
minrate=100k
|
|
||||||
auto-alt-ref=1
|
|
||||||
arnr-maxframes=7
|
|
||||||
arnr-strength=5
|
|
||||||
arnr-type=centered
|
|
|
@ -1,19 +0,0 @@
|
||||||
vcodec=libvpx
|
|
||||||
|
|
||||||
g=120
|
|
||||||
lag-in-frames=25
|
|
||||||
deadline=good
|
|
||||||
cpu-used=0
|
|
||||||
vprofile=0
|
|
||||||
qmax=51
|
|
||||||
qmin=11
|
|
||||||
slices=4
|
|
||||||
b=2M
|
|
||||||
|
|
||||||
#ignored unless using -pass 2
|
|
||||||
maxrate=24M
|
|
||||||
minrate=100k
|
|
||||||
auto-alt-ref=1
|
|
||||||
arnr-maxframes=7
|
|
||||||
arnr-strength=5
|
|
||||||
arnr-type=centered
|
|
|
@ -12,6 +12,8 @@ event_inherited();
|
||||||
#region scroll
|
#region scroll
|
||||||
credits = [
|
credits = [
|
||||||
[ "ImageMagick", "ImageMagick Studio LLC" ],
|
[ "ImageMagick", "ImageMagick Studio LLC" ],
|
||||||
|
[ "WebP", "Google" ],
|
||||||
|
[ "FFmpeg", "FFmpeg team" ],
|
||||||
[ "File dialog module", "Samuel Venable" ],
|
[ "File dialog module", "Samuel Venable" ],
|
||||||
[ "gif importer\nWindow commands\nApollow LUA compiler", "YellowAfterLife" ],
|
[ "gif importer\nWindow commands\nApollow LUA compiler", "YellowAfterLife" ],
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,9 @@ if(!ready) exit;
|
||||||
for(var i = 0; i < array_length(menu); i++) {
|
for(var i = 0; i < array_length(menu); i++) {
|
||||||
var _menuItem = menu[i];
|
var _menuItem = menu[i];
|
||||||
|
|
||||||
|
if(is_instanceof(_menuItem, MenuItem) && _menuItem.shiftMenu != noone && key_mod_press(SHIFT))
|
||||||
|
_menuItem = _menuItem.shiftMenu;
|
||||||
|
|
||||||
if(_menuItem == -1) {
|
if(_menuItem == -1) {
|
||||||
var bx = dialog_x + ui(8);
|
var bx = dialog_x + ui(8);
|
||||||
var bw = dialog_w - ui(16);
|
var bw = dialog_w - ui(16);
|
||||||
|
@ -23,7 +26,7 @@ if(!ready) exit;
|
||||||
var _h = hght;
|
var _h = hght;
|
||||||
var label = _menuItem.name;
|
var label = _menuItem.name;
|
||||||
|
|
||||||
if(instanceof(_menuItem) == "MenuItemGroup")
|
if(is_instanceof(_menuItem, MenuItemGroup))
|
||||||
_h += hght;
|
_h += hght;
|
||||||
|
|
||||||
var hoverable = _menuItem.active && sHOVER;
|
var hoverable = _menuItem.active && sHOVER;
|
||||||
|
@ -61,7 +64,7 @@ if(!ready) exit;
|
||||||
} else if(cc != c_white)
|
} else if(cc != c_white)
|
||||||
draw_sprite_stretched_ext(THEME.textbox, 3, dialog_x, yy, dialog_w, _h, cc, 0.5);
|
draw_sprite_stretched_ext(THEME.textbox, 3, dialog_x, yy, dialog_w, _h, cc, 0.5);
|
||||||
|
|
||||||
if(instanceof(_menuItem) == "MenuItemGroup") {
|
if(is_instanceof(_menuItem, MenuItemGroup)) {
|
||||||
var _submenus = _menuItem.group;
|
var _submenus = _menuItem.group;
|
||||||
draw_set_text(f_p1, fa_center, fa_center, COLORS._main_text_sub);
|
draw_set_text(f_p1, fa_center, fa_center, COLORS._main_text_sub);
|
||||||
draw_set_alpha(_menuItem.active * 0.75 + 0.25);
|
draw_set_alpha(_menuItem.active * 0.75 + 0.25);
|
||||||
|
|
|
@ -100,82 +100,93 @@ event_inherited();
|
||||||
|
|
||||||
ds_list_add(pref_global, __txt("Paths"));
|
ds_list_add(pref_global, __txt("Paths"));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item(
|
||||||
__txtx("pref_directory", "Directory path (restart required)"),
|
__txtx("pref_directory", "Directory path (restart required)"),
|
||||||
function() { return PRESIST_PREF.path; },
|
|
||||||
new textBox(TEXTBOX_INPUT.text, function(txt) {
|
new textBox(TEXTBOX_INPUT.text, function(txt) {
|
||||||
PRESIST_PREF.path = txt;
|
PRESIST_PREF.path = txt;
|
||||||
json_save_struct(APP_DIRECTORY + "persistPreference.json", PRESIST_PREF);
|
json_save_struct(APP_DIRECTORY + "persistPreference.json", PRESIST_PREF);
|
||||||
},
|
})
|
||||||
button(function() {
|
.setSideButton(button(function() {
|
||||||
PRESIST_PREF.path = get_directory(PRESIST_PREF.path);
|
PRESIST_PREF.path = get_directory(PRESIST_PREF.path);
|
||||||
json_save_struct(APP_DIRECTORY + "persistPreference.json", PRESIST_PREF);
|
json_save_struct(APP_DIRECTORY + "persistPreference.json", PRESIST_PREF);
|
||||||
}, THEME.button_path_icon)
|
}, THEME.button_path_icon))
|
||||||
).setFont(f_p2)
|
.setFont(f_p2)
|
||||||
.setEmpty()
|
.setEmpty(),
|
||||||
]);
|
function() { return PRESIST_PREF.path; },
|
||||||
|
function(val) { PRESIST_PREF.path = val; json_save_struct(APP_DIRECTORY + "persistPreference.json", PRESIST_PREF); },
|
||||||
|
APP_DIRECTORY,
|
||||||
|
));
|
||||||
|
|
||||||
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
|
__txtx("pref_directory_temp", "Temp path (restart required)"),
|
||||||
|
"temp_path",
|
||||||
|
new textBox(TEXTBOX_INPUT.text, function(txt) { PREFERENCES.temp_path = txt; PREF_SAVE(); })
|
||||||
|
.setSideButton(button(function() { PREFERENCES.temp_path = get_directory(PREFERENCES.temp_path); PREF_SAVE(); }, THEME.button_path_icon))
|
||||||
|
.setFont(f_p2)
|
||||||
|
.setEmpty(),
|
||||||
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, __txt("Inputs"));
|
ds_list_add(pref_global, __txt("Inputs"));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_double_click_delay", "Double click delay"),
|
__txtx("pref_double_click_delay", "Double click delay"),
|
||||||
"double_click_delay",
|
"double_click_delay",
|
||||||
new slider(0, 1, 0.01, function(val) {
|
new slider(0, 1, 0.01, function(val) {
|
||||||
PREFERENCES.double_click_delay = val;
|
PREFERENCES.double_click_delay = val;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_mouse_wheel_speed", "Scroll speed"),
|
__txtx("pref_mouse_wheel_speed", "Scroll speed"),
|
||||||
"mouse_wheel_speed",
|
"mouse_wheel_speed",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(val) {
|
new textBox(TEXTBOX_INPUT.number, function(val) {
|
||||||
PREFERENCES.mouse_wheel_speed = val;
|
PREFERENCES.mouse_wheel_speed = val;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_keyboard_hold_start", "Keyboard hold start"),
|
__txtx("pref_keyboard_hold_start", "Keyboard hold start"),
|
||||||
"keyboard_repeat_start",
|
"keyboard_repeat_start",
|
||||||
new slider(0, 1, 0.01, function(val) {
|
new slider(0, 1, 0.01, function(val) {
|
||||||
PREFERENCES.keyboard_repeat_start = val;
|
PREFERENCES.keyboard_repeat_start = val;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_keyboard_repeat_delay", "Keyboard repeat delay"),
|
__txtx("pref_keyboard_repeat_delay", "Keyboard repeat delay"),
|
||||||
"keyboard_repeat_speed",
|
"keyboard_repeat_speed",
|
||||||
new slider(0, 1, 0.01, function(val) {
|
new slider(0, 1, 0.01, function(val) {
|
||||||
PREFERENCES.keyboard_repeat_speed = val;
|
PREFERENCES.keyboard_repeat_speed = val;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_expand_hovering_panel", "Expand hovering panel"),
|
__txtx("pref_expand_hovering_panel", "Expand hovering panel"),
|
||||||
"expand_hover",
|
"expand_hover",
|
||||||
new checkBox(function() {
|
new checkBox(function() {
|
||||||
PREFERENCES.expand_hover = !PREFERENCES.expand_hover;
|
PREFERENCES.expand_hover = !PREFERENCES.expand_hover;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, __txt("Save/Load"));
|
ds_list_add(pref_global, __txt("Save/Load"));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_save_file_minify", "Minify save file"),
|
__txtx("pref_save_file_minify", "Minify save file"),
|
||||||
"save_file_minify",
|
"save_file_minify",
|
||||||
new checkBox(function() {
|
new checkBox(function() {
|
||||||
PREFERENCES.save_file_minify = !PREFERENCES.save_file_minify;
|
PREFERENCES.save_file_minify = !PREFERENCES.save_file_minify;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, __txt("Crash"));
|
ds_list_add(pref_global, __txt("Crash"));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_legacy_exception", "Use legacy exception handler"),
|
__txtx("pref_legacy_exception", "Use legacy exception handler"),
|
||||||
"use_legacy_exception",
|
"use_legacy_exception",
|
||||||
new checkBox(function() {
|
new checkBox(function() {
|
||||||
|
@ -183,9 +194,9 @@ event_inherited();
|
||||||
PREF_APPLY();
|
PREF_APPLY();
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_crash_dialog", "Show dialog after crash"),
|
__txtx("pref_crash_dialog", "Show dialog after crash"),
|
||||||
"show_crash_dialog",
|
"show_crash_dialog",
|
||||||
new checkBox(function() {
|
new checkBox(function() {
|
||||||
|
@ -193,27 +204,27 @@ event_inherited();
|
||||||
PREF_APPLY();
|
PREF_APPLY();
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, __txt("Misc"));
|
ds_list_add(pref_global, __txt("Misc"));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_clear_temp", "Clear temp file on close"),
|
__txtx("pref_clear_temp", "Clear temp file on close"),
|
||||||
"clear_temp_on_close",
|
"clear_temp_on_close",
|
||||||
new checkBox(function() {
|
new checkBox(function() {
|
||||||
PREFERENCES.clear_temp_on_close = !PREFERENCES.clear_temp_on_close;
|
PREFERENCES.clear_temp_on_close = !PREFERENCES.clear_temp_on_close;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_global, [
|
ds_list_add(pref_global, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_enable_test_mode", "Enable developer mode (require restart)"),
|
__txtx("pref_enable_test_mode", "Enable developer mode (require restart)"),
|
||||||
"test_mode",
|
"test_mode",
|
||||||
new checkBox(function() {
|
new checkBox(function() {
|
||||||
PREFERENCES.test_mode = !PREFERENCES.test_mode;
|
PREFERENCES.test_mode = !PREFERENCES.test_mode;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region interface
|
#region interface
|
||||||
|
@ -222,10 +233,9 @@ event_inherited();
|
||||||
ds_list_add(pref_appr, __txt("Interface"));
|
ds_list_add(pref_appr, __txt("Interface"));
|
||||||
|
|
||||||
PREFERENCES._display_scaling = PREFERENCES.display_scaling;
|
PREFERENCES._display_scaling = PREFERENCES.display_scaling;
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item(
|
||||||
__txtx("pref_gui_scaling", "GUI scaling"),
|
__txtx("pref_gui_scaling", "GUI scaling"),
|
||||||
"_display_scaling",
|
new slider(0.5, 2, 0.01,, function(val) {
|
||||||
new slider(0.5, 2, 0.01, function(val) {
|
|
||||||
PREFERENCES._display_scaling = val;
|
PREFERENCES._display_scaling = val;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
}, function() {
|
}, function() {
|
||||||
|
@ -238,10 +248,13 @@ event_inherited();
|
||||||
loadFonts();
|
loadFonts();
|
||||||
|
|
||||||
time_source_start(time_source_create(time_source_global, 1, time_source_units_frames, onResize));
|
time_source_start(time_source_create(time_source_global, 1, time_source_units_frames, onResize));
|
||||||
})
|
}),
|
||||||
]);
|
function() { return PREFERENCES._display_scaling; },
|
||||||
|
function(val) { PREFERENCES.display_scaling = val; PREFERENCES._display_scaling = val; },
|
||||||
|
1,
|
||||||
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_ui_frame_rate", "UI frame rate"),
|
__txtx("pref_ui_frame_rate", "UI frame rate"),
|
||||||
"ui_framerate",
|
"ui_framerate",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(str) {
|
new textBox(TEXTBOX_INPUT.number, function(str) {
|
||||||
|
@ -249,7 +262,7 @@ event_inherited();
|
||||||
game_set_speed(PREFERENCES.ui_framerate, gamespeed_fps);
|
game_set_speed(PREFERENCES.ui_framerate, gamespeed_fps);
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
locals = [];
|
locals = [];
|
||||||
var f = file_find_first(DIRECTORY + "Locale/*", fa_directory);
|
var f = file_find_first(DIRECTORY + "Locale/*", fa_directory);
|
||||||
|
@ -260,7 +273,7 @@ event_inherited();
|
||||||
}
|
}
|
||||||
file_find_close();
|
file_find_close();
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_interface_language", "Interface Language (restart required)"),
|
__txtx("pref_interface_language", "Interface Language (restart required)"),
|
||||||
"local",
|
"local",
|
||||||
new scrollBox(locals, function(str) {
|
new scrollBox(locals, function(str) {
|
||||||
|
@ -268,22 +281,22 @@ event_inherited();
|
||||||
PREFERENCES.local = locals[str];
|
PREFERENCES.local = locals[str];
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
}, false)
|
}, false)
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, __txt("Splash"));
|
ds_list_add(pref_appr, __txt("Splash"));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_auto_save_time", "Autosave delay (-1 to disable)"),
|
__txtx("pref_auto_save_time", "Autosave delay (-1 to disable)"),
|
||||||
"auto_save_time",
|
"auto_save_time",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(val) {
|
new textBox(TEXTBOX_INPUT.number, function(val) {
|
||||||
PREFERENCES.auto_save_time = val;
|
PREFERENCES.auto_save_time = val;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, __txt("Graph"));
|
ds_list_add(pref_appr, __txt("Graph"));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_connection_type", "Connection type"),
|
__txtx("pref_connection_type", "Connection type"),
|
||||||
"curve_connection_line",
|
"curve_connection_line",
|
||||||
new buttonGroup([ THEME.icon_curve_connection, THEME.icon_curve_connection, THEME.icon_curve_connection, THEME.icon_curve_connection ],
|
new buttonGroup([ THEME.icon_curve_connection, THEME.icon_curve_connection, THEME.icon_curve_connection, THEME.icon_curve_connection ],
|
||||||
|
@ -291,103 +304,103 @@ event_inherited();
|
||||||
PREFERENCES.curve_connection_line = val;
|
PREFERENCES.curve_connection_line = val;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_connection_thickness", "Connection thickness"),
|
__txtx("pref_connection_thickness", "Connection thickness"),
|
||||||
"connection_line_width",
|
"connection_line_width",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(str) {
|
new textBox(TEXTBOX_INPUT.number, function(str) {
|
||||||
PREFERENCES.connection_line_width = real(str);
|
PREFERENCES.connection_line_width = real(str);
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_connection_curve_smoothness", "Connection curve smoothness"),
|
__txtx("pref_connection_curve_smoothness", "Connection curve smoothness"),
|
||||||
"connection_line_sample",
|
"connection_line_sample",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(str) {
|
new textBox(TEXTBOX_INPUT.number, function(str) {
|
||||||
PREFERENCES.connection_line_sample = real(str);
|
PREFERENCES.connection_line_sample = real(str);
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_connection_aa", "Connection anti aliasing"),
|
__txtx("pref_connection_aa", "Connection anti aliasing"),
|
||||||
"connection_line_aa",
|
"connection_line_aa",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(str) {
|
new textBox(TEXTBOX_INPUT.number, function(str) {
|
||||||
PREFERENCES.connection_line_aa = max(1, real(str));
|
PREFERENCES.connection_line_aa = max(1, real(str));
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
])
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_connection_anim", "Connection line animation"),
|
__txtx("pref_connection_anim", "Connection line animation"),
|
||||||
"connection_line_transition",
|
"connection_line_transition",
|
||||||
new checkBox(function() {
|
new checkBox(function() {
|
||||||
PREFERENCES.connection_line_transition = !PREFERENCES.connection_line_transition;
|
PREFERENCES.connection_line_transition = !PREFERENCES.connection_line_transition;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
])
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_windows_control", "Use Windows style window control."),
|
__txtx("pref_windows_control", "Use Windows style window control."),
|
||||||
"panel_menu_right_control",
|
"panel_menu_right_control",
|
||||||
new checkBox(function() {
|
new checkBox(function() {
|
||||||
PREFERENCES.panel_menu_right_control = !PREFERENCES.panel_menu_right_control;
|
PREFERENCES.panel_menu_right_control = !PREFERENCES.panel_menu_right_control;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_graph_zoom_smoothing", "Graph zoom smoothing"),
|
__txtx("pref_graph_zoom_smoothing", "Graph zoom smoothing"),
|
||||||
"graph_zoom_smoooth",
|
"graph_zoom_smoooth",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(str) {
|
new textBox(TEXTBOX_INPUT.number, function(str) {
|
||||||
PREFERENCES.graph_zoom_smoooth = max(1, round(real(str)));
|
PREFERENCES.graph_zoom_smoooth = max(1, round(real(str)));
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, __txt("Inspector"));
|
ds_list_add(pref_appr, __txt("Inspector"));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_inspector_line_break_width", "Inspector line break width"),
|
__txtx("pref_inspector_line_break_width", "Inspector line break width"),
|
||||||
"inspector_line_break_width",
|
"inspector_line_break_width",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(str) {
|
new textBox(TEXTBOX_INPUT.number, function(str) {
|
||||||
PREFERENCES.inspector_line_break_width = max(1, round(real(str)));
|
PREFERENCES.inspector_line_break_width = max(1, round(real(str)));
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_inspector_focus_on_double_click", "Focus on double click"),
|
__txtx("pref_inspector_focus_on_double_click", "Focus on double click"),
|
||||||
"PREFERENCES.inspector_focus_on_double_click",
|
"PREFERENCES.inspector_focus_on_double_click",
|
||||||
new checkBox(function(str) {
|
new checkBox(function(str) {
|
||||||
PREFERENCES.inspector_focus_on_double_click = !PREFERENCES.inspector_focus_on_double_click;
|
PREFERENCES.inspector_focus_on_double_click = !PREFERENCES.inspector_focus_on_double_click;
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, __txt("Collection"));
|
ds_list_add(pref_appr, __txt("Collection"));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_collection_preview_speed", "Collection preview speed"),
|
__txtx("pref_collection_preview_speed", "Collection preview speed"),
|
||||||
"collection_preview_speed",
|
"collection_preview_speed",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(str) {
|
new textBox(TEXTBOX_INPUT.number, function(str) {
|
||||||
PREFERENCES.collection_preview_speed = max(1, round(real(str)));
|
PREFERENCES.collection_preview_speed = max(1, round(real(str)));
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
ds_list_add(pref_appr, __txt("Notification"));
|
ds_list_add(pref_appr, __txt("Notification"));
|
||||||
|
|
||||||
ds_list_add(pref_appr, [
|
ds_list_add(pref_appr, new __Panel_Linear_Setting_Item_Preference(
|
||||||
__txtx("pref_warning_notification_time", "Warning notification time"),
|
__txtx("pref_warning_notification_time", "Warning notification time"),
|
||||||
"notification_time",
|
"notification_time",
|
||||||
new textBox(TEXTBOX_INPUT.number, function(str) {
|
new textBox(TEXTBOX_INPUT.number, function(str) {
|
||||||
PREFERENCES.notification_time = max(0, round(real(str)));
|
PREFERENCES.notification_time = max(0, round(real(str)));
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
})
|
})
|
||||||
]);
|
));
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -507,7 +520,7 @@ event_inherited();
|
||||||
ind++;
|
ind++;
|
||||||
}
|
}
|
||||||
|
|
||||||
sections[2] = sect;
|
sections[page_current] = sect;
|
||||||
|
|
||||||
return hh;
|
return hh;
|
||||||
});
|
});
|
||||||
|
@ -807,13 +820,13 @@ event_inherited();
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
sections[3] = sect;
|
sections[page_current] = sect;
|
||||||
|
|
||||||
return hh;
|
return hh;
|
||||||
})
|
})
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region draw
|
#region scrollpane
|
||||||
current_list = pref_global;
|
current_list = pref_global;
|
||||||
|
|
||||||
sp_pref = new scrollPane(dialog_w - ui(padding + padding + page_width), dialog_h - ui(title_height + padding), function(_y, _m, _r) {
|
sp_pref = new scrollPane(dialog_w - ui(padding + padding + page_width), dialog_h - ui(title_height + padding), function(_y, _m, _r) {
|
||||||
|
@ -829,11 +842,10 @@ event_inherited();
|
||||||
var _pref = current_list[| i];
|
var _pref = current_list[| i];
|
||||||
if(is_string(_pref)) continue;
|
if(is_string(_pref)) continue;
|
||||||
|
|
||||||
var name = _pref[0];
|
if(search_text != "" && string_pos(string_lower(search_text), string_lower(_pref.name)) == 0)
|
||||||
if(search_text != "" && string_pos(string_lower(search_text), string_lower(name)) == 0)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
_pref[2].register(sp_pref);
|
_pref.editWidget.register(sp_pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
var sect = [];
|
var sect = [];
|
||||||
|
@ -858,9 +870,8 @@ event_inherited();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var name = _pref[0];
|
var name = _pref.name;
|
||||||
var txt = _pref[1];
|
var data = _pref.data();
|
||||||
txt = is_method(txt)? txt() : PREFERENCES[$ txt];
|
|
||||||
|
|
||||||
if(search_text != "" && string_pos(string_lower(search_text), string_lower(name)) == 0)
|
if(search_text != "" && string_pos(string_lower(search_text), string_lower(name)) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
@ -868,25 +879,40 @@ event_inherited();
|
||||||
if(ind % 2 == 0) draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, yy - padd, sp_pref.surface_w, th + padd * 2, COLORS.dialog_preference_prop_bg, 1);
|
if(ind % 2 == 0) draw_sprite_stretched_ext(THEME.ui_panel_bg, 0, 0, yy - padd, sp_pref.surface_w, th + padd * 2, COLORS.dialog_preference_prop_bg, 1);
|
||||||
|
|
||||||
draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
|
draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
|
||||||
draw_text_add(ui(24), yy + th / 2, _pref[0]);
|
draw_text_add(ui(24), yy + th / 2, name);
|
||||||
_pref[2].setFocusHover(sFOCUS, sHOVER && sp_pref.hover);
|
_pref.editWidget.setFocusHover(sFOCUS, sHOVER && sp_pref.hover);
|
||||||
|
|
||||||
var widget_w = ui(240);
|
var widget_w = ui(240);
|
||||||
var widget_h = th;
|
var widget_h = th;
|
||||||
|
|
||||||
if(instanceof(_pref[2]) == "textBox")
|
if(is_instanceof(_pref.editWidget, textBox))
|
||||||
widget_w = _pref[2].input == TEXTBOX_INPUT.text? ui(400) : widget_w;
|
widget_w = _pref.editWidget.input == TEXTBOX_INPUT.text? ui(400) : widget_w;
|
||||||
|
|
||||||
var widget_x = x1 - ui(4) - widget_w;
|
var widget_x = x1 - ui(4) - widget_w;
|
||||||
var widget_y = yy;
|
var widget_y = yy;
|
||||||
|
|
||||||
var params = new widgetParam(widget_x, widget_y, widget_w, widget_h, txt, {}, _m, _r[0], _r[1]);
|
if(_pref.getDefault != noone)
|
||||||
|
widget_w -= ui(32 + 8);
|
||||||
|
|
||||||
|
var params = new widgetParam(widget_x, widget_y, widget_w, widget_h, data, {}, _m, _r[0], _r[1]);
|
||||||
params.s = ui(30);
|
params.s = ui(30);
|
||||||
|
|
||||||
if(instanceof(_pref[2]) == "checkBox")
|
if(instanceof(_pref.editWidget) == "checkBox") params.halign = fa_center;
|
||||||
params.halign = fa_center;
|
var th = _pref.editWidget.drawParam(params) ?? 0;
|
||||||
|
|
||||||
var th = _pref[2].drawParam(params) ?? 0;
|
if(_pref.getDefault != noone) {
|
||||||
|
var _defVal = is_method(_pref.getDefault)? _pref.getDefault() : _pref.getDefault;
|
||||||
|
var _bs = ui(32);
|
||||||
|
var _bx = x1 - ui(4) - _bs;
|
||||||
|
var _by = yy + th / 2 - _bs / 2;
|
||||||
|
|
||||||
|
if(isEqual(data, _defVal))
|
||||||
|
draw_sprite_ext(THEME.refresh_s, 0, _bx + _bs / 2, _by + _bs / 2, 1, 1, 0, COLORS._main_icon_dark);
|
||||||
|
else {
|
||||||
|
if(buttonInstant(THEME.button_hide, _bx, _by, _bs, _bs, _m, sFOCUS, sHOVER && sp_pref.hover, __txt("Reset"), THEME.refresh_s) == 2)
|
||||||
|
_pref.onEdit(_defVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
yy += th + padd + ui(8);
|
yy += th + padd + ui(8);
|
||||||
hh += th + padd + ui(8);
|
hh += th + padd + ui(8);
|
||||||
|
|
|
@ -412,7 +412,7 @@ event_inherited();
|
||||||
|
|
||||||
var _att_first = _att[0];
|
var _att_first = _att[0];
|
||||||
if(!ds_map_exists(attachment, _att_first.id)) {
|
if(!ds_map_exists(attachment, _att_first.id)) {
|
||||||
var path = DIRECTORY + "temp/" + _att_first.id + ".png";
|
var path = TEMPDIR + _att_first.id + ".png";
|
||||||
attachment[? _att_first.id] = [ http_get_file(_att_first.url, path), path ];
|
attachment[? _att_first.id] = [ http_get_file(_att_first.url, path), path ];
|
||||||
} else if(!is_array(attachment[? _att_first.id]) && sprite_exists(attachment[? _att_first.id])) {
|
} else if(!is_array(attachment[? _att_first.id]) && sprite_exists(attachment[? _att_first.id])) {
|
||||||
var sub = attachment[? _att_first.id];
|
var sub = attachment[? _att_first.id];
|
||||||
|
|
|
@ -77,7 +77,7 @@ for( var i = 0, n = array_length(contest_message_req); i < n; i++ ) {
|
||||||
var att = thr.title.attachments[0];
|
var att = thr.title.attachments[0];
|
||||||
thr.title.attachments = att;
|
thr.title.attachments = att;
|
||||||
|
|
||||||
var path = DIRECTORY + "temp/" + att.id + filename_ext(att.url);
|
var path = TEMPDIR + att.id + filename_ext(att.url);
|
||||||
attachment[? att.id] = [ http_get_file(att.url, path), path ];
|
attachment[? att.id] = [ http_get_file(att.url, path), path ];
|
||||||
} else
|
} else
|
||||||
thr.title.attachments = noone;
|
thr.title.attachments = noone;
|
||||||
|
|
|
@ -133,10 +133,10 @@ if(OS == os_windows && gameframe_is_minimized()) exit;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region safe mode
|
#region safe mode
|
||||||
if(SAFE_MODE) {
|
if(PROJECT.safeMode) {
|
||||||
draw_sprite_stretched_ext(THEME.ui_panel_active, 0, 0, 0, WIN_W, WIN_H, COLORS._main_value_negative, 1);
|
draw_sprite_stretched_ext(THEME.ui_panel_active, 0, 0, 0, WIN_W, WIN_H, COLORS._main_value_negative, 1);
|
||||||
draw_set_text(f_h1, fa_right, fa_bottom, COLORS._main_value_negative);
|
draw_set_text(f_h1, fa_right, fa_bottom, COLORS._main_value_negative);
|
||||||
draw_set_alpha(0.1);
|
draw_set_alpha(0.25);
|
||||||
draw_text(WIN_W - ui(16), WIN_H - ui(8), __txtx("safe_mode", "SAFE MODE"));
|
draw_text(WIN_W - ui(16), WIN_H - ui(8), __txtx("safe_mode", "SAFE MODE"));
|
||||||
draw_set_alpha(1);
|
draw_set_alpha(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,10 +42,7 @@
|
||||||
PRESIST_PREF.path = DIRECTORY;
|
PRESIST_PREF.path = DIRECTORY;
|
||||||
json_save_struct(perstPath, PRESIST_PREF);
|
json_save_struct(perstPath, PRESIST_PREF);
|
||||||
|
|
||||||
if(!directory_exists(DIRECTORY))
|
directory_verify(DIRECTORY);
|
||||||
directory_create(DIRECTORY);
|
|
||||||
if(!directory_exists(DIRECTORY + "temp"))
|
|
||||||
directory_create(DIRECTORY + "temp");
|
|
||||||
|
|
||||||
METADATA = __getdefaultMetaData();
|
METADATA = __getdefaultMetaData();
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
if(OS == os_windows && gameframe_is_minimized()) exit;
|
if(OS == os_windows && gameframe_is_minimized()) exit;
|
||||||
|
|
||||||
//print("===== Step start =====");
|
//print("===== Step start =====");
|
||||||
if(PROJECT.active) {
|
if(PROJECT.active && !PROJECT.safeMode) {
|
||||||
PROJECT.animator.step();
|
PROJECT.animator.step();
|
||||||
|
|
||||||
#region step
|
#region step
|
||||||
|
@ -103,8 +103,8 @@ if(PROJECT.active) {
|
||||||
_modified = PROJECT.modified;
|
_modified = PROJECT.modified;
|
||||||
|
|
||||||
var cap = "";
|
var cap = "";
|
||||||
if(SAFE_MODE) cap += "[SAFE MODE] ";
|
if(PROJECT.safeMode) cap += "[SAFE MODE] ";
|
||||||
if(PROJECT.readonly) cap += "[READ ONLY] ";
|
if(PROJECT.readonly) cap += "[READ ONLY] ";
|
||||||
cap += PROJECT.path + (PROJECT.modified? "*" : "") + " - Pixel Composer";
|
cap += PROJECT.path + (PROJECT.modified? "*" : "") + " - Pixel Composer";
|
||||||
|
|
||||||
window_set_caption(cap);
|
window_set_caption(cap);
|
||||||
|
|
|
@ -80,36 +80,38 @@ _HOVERING_ELEMENT = noone;
|
||||||
//physics_pause_enable(true);
|
//physics_pause_enable(true);
|
||||||
DEF_SURFACE_RESET();
|
DEF_SURFACE_RESET();
|
||||||
|
|
||||||
if(UPDATE_RENDER_ORDER) {
|
if(!PROJECT.safeMode) {
|
||||||
ResetAllNodesRender();
|
if(UPDATE_RENDER_ORDER) {
|
||||||
NodeTopoSort();
|
ResetAllNodesRender();
|
||||||
}
|
NodeTopoSort();
|
||||||
UPDATE_RENDER_ORDER = false;
|
|
||||||
|
|
||||||
if(PROJECT.active) {
|
|
||||||
var _k = ds_map_find_first(PROJECT.nodeMap);
|
|
||||||
var _a = ds_map_size(PROJECT.nodeMap);
|
|
||||||
repeat(_a) {
|
|
||||||
PROJECT.nodeMap[? _k].stepBegin();
|
|
||||||
_k = ds_map_find_next(PROJECT.nodeMap, _k);
|
|
||||||
}
|
}
|
||||||
|
UPDATE_RENDER_ORDER = false;
|
||||||
|
|
||||||
if(PROJECT.animator.is_playing || PROJECT.animator.rendering) {
|
if(PROJECT.active) {
|
||||||
if(PROJECT.animator.frame_progress) {
|
var _k = ds_map_find_first(PROJECT.nodeMap);
|
||||||
__addon_preAnim();
|
var _a = ds_map_size(PROJECT.nodeMap);
|
||||||
|
repeat(_a) {
|
||||||
if(CURRENT_FRAME == 0)
|
PROJECT.nodeMap[? _k].stepBegin();
|
||||||
ResetAllNodesRender();
|
_k = ds_map_find_next(PROJECT.nodeMap, _k);
|
||||||
Render(true);
|
}
|
||||||
|
|
||||||
__addon_postAnim();
|
if(PROJECT.animator.is_playing || PROJECT.animator.rendering) {
|
||||||
|
if(PROJECT.animator.frame_progress) {
|
||||||
|
__addon_preAnim();
|
||||||
|
|
||||||
|
if(CURRENT_FRAME == 0)
|
||||||
|
ResetAllNodesRender();
|
||||||
|
Render(true);
|
||||||
|
|
||||||
|
__addon_postAnim();
|
||||||
|
}
|
||||||
|
PROJECT.animator.frame_progress = false;
|
||||||
|
} else {
|
||||||
|
if(UPDATE & RENDER_TYPE.full)
|
||||||
|
Render();
|
||||||
|
else if(UPDATE & RENDER_TYPE.partial)
|
||||||
|
Render(true);
|
||||||
}
|
}
|
||||||
PROJECT.animator.frame_progress = false;
|
|
||||||
} else {
|
|
||||||
if(UPDATE & RENDER_TYPE.full)
|
|
||||||
Render();
|
|
||||||
else if(UPDATE & RENDER_TYPE.partial)
|
|
||||||
Render(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,7 @@ function Panel_Linear_Setting() : PanelContent() constructor {
|
||||||
var _by = yy - _bs / 2;
|
var _by = yy - _bs / 2;
|
||||||
|
|
||||||
if(isEqual(_data, _defVal))
|
if(isEqual(_data, _defVal))
|
||||||
draw_sprite_ext(THEME.refresh_s, 0, _bx + _bs / 2, _by + _bs / 2, 1, 1, 0, COLORS._main_icon, 0.6);
|
draw_sprite_ext(THEME.refresh_s, 0, _bx + _bs / 2, _by + _bs / 2, 1, 1, 0, COLORS._main_icon_dark);
|
||||||
else {
|
else {
|
||||||
if(buttonInstant(THEME.button_hide, _bx, _by, _bs, _bs, [ mx, my ], pFOCUS, pHOVER, __txt("Reset"), THEME.refresh_s) == 2)
|
if(buttonInstant(THEME.button_hide, _bx, _by, _bs, _bs, [ mx, my ], pFOCUS, pHOVER, __txt("Reset"), THEME.refresh_s) == 2)
|
||||||
_prop.onEdit(_defVal);
|
_prop.onEdit(_defVal);
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function menuItem(name, func, spr = noone, hotkey = noone, toggle = noone) {
|
function menuItem(name, func, spr = noone, hotkey = noone, toggle = noone) {
|
||||||
|
gml_pragma("forceinline");
|
||||||
return new MenuItem(name, func, spr, hotkey, toggle);
|
return new MenuItem(name, func, spr, hotkey, toggle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,26 +40,37 @@
|
||||||
self.spr = spr;
|
self.spr = spr;
|
||||||
self.hotkey = hotkey;
|
self.hotkey = hotkey;
|
||||||
self.toggle = toggle;
|
self.toggle = toggle;
|
||||||
color = c_white;
|
color = c_white;
|
||||||
|
|
||||||
isShelf = false;
|
isShelf = false;
|
||||||
|
|
||||||
|
shiftMenu = noone;
|
||||||
|
|
||||||
static setIsShelf = function() {
|
static setIsShelf = function() {
|
||||||
|
gml_pragma("forceinline");
|
||||||
isShelf = true;
|
isShelf = true;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
static setActive = function(active) {
|
static setActive = function(active) {
|
||||||
|
gml_pragma("forceinline");
|
||||||
self.active = active;
|
self.active = active;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
static setColor = function(color) {
|
static setColor = function(color) {
|
||||||
|
gml_pragma("forceinline");
|
||||||
self.color = color;
|
self.color = color;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static setShiftMenu = function(shiftMenu) {
|
||||||
|
gml_pragma("forceinline");
|
||||||
|
self.shiftMenu = shiftMenu;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
static deactivate = function() {
|
static deactivate = function() {
|
||||||
|
gml_pragma("forceinline");
|
||||||
active = false;
|
active = false;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ function exportPortable(project = PROJECT) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var pro_path = DIRECTORY + "temp/" + raw_name + ".pxc";
|
var pro_path = TEMPDIR + raw_name + ".pxc";
|
||||||
var file = file_text_open_write(pro_path);
|
var file = file_text_open_write(pro_path);
|
||||||
file_text_write_string(file, PREFERENCES.save_file_minify? json_stringify_minify(_proj) : json_stringify(_proj, true));
|
file_text_write_string(file, PREFERENCES.save_file_minify? json_stringify_minify(_proj) : json_stringify(_proj, true));
|
||||||
file_text_close(file);
|
file_text_close(file);
|
||||||
|
|
|
@ -2,3 +2,13 @@ function file_copy_override(src, dest) {
|
||||||
if(file_exists(dest)) file_delete(dest);
|
if(file_exists(dest)) file_delete(dest);
|
||||||
file_copy(src, dest);
|
file_copy(src, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function filepath_resolve(path) {
|
||||||
|
gml_pragma("forceinline");
|
||||||
|
var _path = path;
|
||||||
|
|
||||||
|
_path = string_replace_all(_path, "%DIR%/", DIRECTORY);
|
||||||
|
_path = string_replace_all(_path, "%APP%/", working_directory);
|
||||||
|
|
||||||
|
return _path;
|
||||||
|
}
|
|
@ -1,12 +1,11 @@
|
||||||
#region save
|
#region save
|
||||||
globalvar LOADING, APPENDING, CLONING, SAFE_MODE;
|
globalvar LOADING, APPENDING, CLONING;
|
||||||
globalvar CONNECTION_CONFLICT, ALWAYS_FULL;
|
globalvar CONNECTION_CONFLICT, ALWAYS_FULL;
|
||||||
globalvar MESSAGE;
|
globalvar MESSAGE;
|
||||||
|
|
||||||
LOADING = false;
|
LOADING = false;
|
||||||
CLONING = false;
|
CLONING = false;
|
||||||
APPENDING = false;
|
APPENDING = false;
|
||||||
SAFE_MODE = false;
|
|
||||||
MESSAGE = noone;
|
MESSAGE = noone;
|
||||||
|
|
||||||
CONNECTION_CONFLICT = ds_queue_create();
|
CONNECTION_CONFLICT = ds_queue_create();
|
||||||
|
@ -61,6 +60,10 @@
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region macro
|
#region macro
|
||||||
|
#macro TEMPDIR filepath_resolve(PREFERENCES.temp_path)
|
||||||
|
|
||||||
|
#macro NOT_LOAD !LOADING && !APPENDING
|
||||||
|
|
||||||
#macro WIN_W window_get_width()
|
#macro WIN_W window_get_width()
|
||||||
#macro WIN_H window_get_height()
|
#macro WIN_H window_get_height()
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
function LOAD() {
|
function LOAD(safe = false) {
|
||||||
if(DEMO) return false;
|
if(DEMO) return false;
|
||||||
|
|
||||||
var path = get_open_filename("Pixel Composer PROJECT (.pxc)|*.pxc", "");
|
var path = get_open_filename("Pixel Composer PROJECT (.pxc)|*.pxc", "");
|
||||||
|
@ -7,7 +7,7 @@ function LOAD() {
|
||||||
if(filename_ext(path) != ".json" && filename_ext(path) != ".pxc") return;
|
if(filename_ext(path) != ".json" && filename_ext(path) != ".pxc") return;
|
||||||
|
|
||||||
gc_collect();
|
gc_collect();
|
||||||
LOAD_PATH(path);
|
var proj = LOAD_PATH(path, false, safe);
|
||||||
}
|
}
|
||||||
|
|
||||||
function TEST_PATH(path) {
|
function TEST_PATH(path) {
|
||||||
|
@ -18,7 +18,7 @@ function TEST_PATH(path) {
|
||||||
PROJECT = new Project();
|
PROJECT = new Project();
|
||||||
PANEL_GRAPH.setProject(PROJECT);
|
PANEL_GRAPH.setProject(PROJECT);
|
||||||
|
|
||||||
__LOAD_PATH(path, false, false);
|
__LOAD_PATH(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
function LOAD_PATH(path, readonly = false, safe_mode = false) {
|
function LOAD_PATH(path, readonly = false, safe_mode = false) {
|
||||||
|
@ -40,17 +40,16 @@ function LOAD_PATH(path, readonly = false, safe_mode = false) {
|
||||||
array_push(PROJECTS, PROJECT);
|
array_push(PROJECTS, PROJECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
var res = __LOAD_PATH(path, readonly, safe_mode);
|
var res = __LOAD_PATH(path, readonly);
|
||||||
if(!res) return false;
|
if(!res) return false;
|
||||||
|
|
||||||
|
PROJECT.safeMode = safe_mode;
|
||||||
setFocus(PANEL_GRAPH.panel);
|
setFocus(PANEL_GRAPH.panel);
|
||||||
|
|
||||||
return PROJECT;
|
return PROJECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
function __LOAD_PATH(path, readonly = false, safe_mode = false, override = false) {
|
function __LOAD_PATH(path, readonly = false, override = false) {
|
||||||
SAFE_MODE = safe_mode;
|
|
||||||
|
|
||||||
if(DEMO) return false;
|
if(DEMO) return false;
|
||||||
|
|
||||||
if(!file_exists(path)) {
|
if(!file_exists(path)) {
|
||||||
|
@ -74,11 +73,10 @@ function __LOAD_PATH(path, readonly = false, safe_mode = false, override = false
|
||||||
ds_list_clear(ERRORS);
|
ds_list_clear(ERRORS);
|
||||||
}
|
}
|
||||||
|
|
||||||
var temp_path = DIRECTORY + "temp";
|
var temp_path = TEMPDIR;
|
||||||
if(!directory_exists(temp_path))
|
directory_verify(temp_path);
|
||||||
directory_create(temp_path);
|
|
||||||
|
|
||||||
var temp_file_path = temp_path + "/" + string(UUID_generate(6));
|
var temp_file_path = TEMPDIR + string(UUID_generate(6));
|
||||||
if(file_exists(temp_file_path)) file_delete(temp_file_path);
|
if(file_exists(temp_file_path)) file_delete(temp_file_path);
|
||||||
file_copy(path, temp_file_path);
|
file_copy(path, temp_file_path);
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ function Node_Cache(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
|
||||||
name = "Cache";
|
name = "Cache";
|
||||||
use_cache = CACHE_USE.auto;
|
use_cache = CACHE_USE.auto;
|
||||||
clearCacheOnChange = false;
|
clearCacheOnChange = false;
|
||||||
|
update_on_frame = true;
|
||||||
|
|
||||||
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
|
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ function Node_Cache_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constru
|
||||||
name = "Cache Array";
|
name = "Cache Array";
|
||||||
use_cache = CACHE_USE.manual;
|
use_cache = CACHE_USE.manual;
|
||||||
clearCacheOnChange = false;
|
clearCacheOnChange = false;
|
||||||
|
update_on_frame = true;
|
||||||
|
|
||||||
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
|
inputs[| 0] = nodeValue("Surface in", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0);
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ function Node_Cache_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constru
|
||||||
|
|
||||||
static onInspector2Update = function() { clearCache(); }
|
static onInspector2Update = function() { clearCache(); }
|
||||||
|
|
||||||
static step = function() {
|
static step = function() { #region
|
||||||
if(!cache_loading) return;
|
if(!cache_loading) return;
|
||||||
|
|
||||||
var _content = cache_content[cache_loading_progress];
|
var _content = cache_content[cache_loading_progress];
|
||||||
|
@ -40,9 +41,9 @@ function Node_Cache_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constru
|
||||||
cache_loading = false;
|
cache_loading = false;
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
}
|
} #endregion
|
||||||
|
|
||||||
static update = function() {
|
static update = function() { #region
|
||||||
var ss = [];
|
var ss = [];
|
||||||
var str = getInputData(1);
|
var str = getInputData(1);
|
||||||
var lst = getInputData(2);
|
var lst = getInputData(2);
|
||||||
|
@ -57,33 +58,27 @@ function Node_Cache_Array(_x, _y, _group = noone) : Node(_x, _y, _group) constru
|
||||||
if(CURRENT_FRAME < str) return;
|
if(CURRENT_FRAME < str) return;
|
||||||
if(CURRENT_FRAME > lst) return;
|
if(CURRENT_FRAME > lst) return;
|
||||||
|
|
||||||
|
cacheCurrentFrame(getInputData(0));
|
||||||
|
|
||||||
if(lst > str && stp > 0)
|
if(lst > str && stp > 0)
|
||||||
for( var i = str; i <= lst; i += stp ) {
|
for( var i = str; i <= lst; i += stp )
|
||||||
if(cacheExist(i))
|
if(cacheExist(i)) array_push(ss, cached_output[i]);
|
||||||
array_push(ss, cached_output[i]);
|
|
||||||
}
|
|
||||||
outputs[| 0].setValue(ss);
|
outputs[| 0].setValue(ss);
|
||||||
|
} #endregion
|
||||||
|
|
||||||
if(!PROJECT.animator.is_playing) return;
|
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
|
||||||
if(!inputs[| 0].value_from) return;
|
if(cache_loading) draw_sprite_ui(THEME.loading, 0, xx + w * _s / 2, yy + h * _s / 2, _s, _s, current_time / 2, COLORS._main_icon, 1);
|
||||||
|
} #endregion
|
||||||
|
|
||||||
var _surf = getInputData(0);
|
static doSerialize = function(_map) { #region
|
||||||
cacheCurrentFrame(_surf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
|
|
||||||
if(cache_loading)
|
|
||||||
draw_sprite_ui(THEME.loading, 0, xx + w * _s / 2, yy + h * _s / 2, _s, _s, current_time / 2, COLORS._main_icon, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static doSerialize = function(_map) {
|
|
||||||
_map.cache = surface_array_serialize(cached_output);
|
_map.cache = surface_array_serialize(cached_output);
|
||||||
}
|
} #endregion
|
||||||
|
|
||||||
static postDeserialize = function() {
|
static postDeserialize = function() { #region
|
||||||
if(!struct_has(load_map, "cache")) return;
|
if(!struct_has(load_map, "cache")) return;
|
||||||
cache_content = json_try_parse(load_map.cache);
|
cache_content = json_try_parse(load_map.cache);
|
||||||
cache_loading_progress = 0;
|
cache_loading_progress = 0;
|
||||||
cache_loading = true;
|
cache_loading = true;
|
||||||
}
|
} #endregion
|
||||||
}
|
}
|
|
@ -49,26 +49,28 @@ function Node_Color_adjust(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro
|
||||||
outputs[| 1] = nodeValue("Color out", self, JUNCTION_CONNECT.output, VALUE_TYPE.color, [])
|
outputs[| 1] = nodeValue("Color out", self, JUNCTION_CONNECT.output, VALUE_TYPE.color, [])
|
||||||
.setDisplay(VALUE_DISPLAY.palette);
|
.setDisplay(VALUE_DISPLAY.palette);
|
||||||
|
|
||||||
input_display_list = [11, 12, 0, 8, 13,
|
input_display_list = [11, 12, 0, 8, 13, 9,
|
||||||
["Brightness", false], 1, 10, 2,
|
["Brightness", false], 1, 10, 2,
|
||||||
["HSV", false], 3, 4, 5,
|
["HSV", false], 3, 4, 5,
|
||||||
["Color blend", false], 6, 14, 7, 9
|
["Color blend", false], 6, 14, 7
|
||||||
];
|
];
|
||||||
|
|
||||||
temp_surface = [ surface_create(1, 1) ];
|
temp_surface = [ surface_create(1, 1) ];
|
||||||
|
|
||||||
attribute_surface_depth();
|
attribute_surface_depth();
|
||||||
|
|
||||||
static step = function() {
|
static step = function() { #region
|
||||||
var type = getInputData(12);
|
var type = getInputData(12);
|
||||||
|
|
||||||
inputs[| 0].setVisible(type == 0, type == 0);
|
inputs[| 0].setVisible(type == 0, type == 0);
|
||||||
inputs[| 8].setVisible(type == 0, type == 0);
|
inputs[| 8].setVisible(type == 0, type == 0);
|
||||||
|
inputs[| 9].setVisible(type == 0);
|
||||||
inputs[| 13].setVisible(type == 1, type == 1);
|
inputs[| 13].setVisible(type == 1, type == 1);
|
||||||
|
inputs[| 14].setVisible(type == 0);
|
||||||
|
|
||||||
outputs[| 0].setVisible(type == 0, type == 0);
|
outputs[| 0].setVisible(type == 0, type == 0);
|
||||||
outputs[| 1].setVisible(type == 1, type == 1);
|
outputs[| 1].setVisible(type == 1, type == 1);
|
||||||
}
|
} #endregion
|
||||||
|
|
||||||
static processData = function(_outSurf, _data, _output_index, _array_index) { #region
|
static processData = function(_outSurf, _data, _output_index, _array_index) { #region
|
||||||
var _bri = _data[1];
|
var _bri = _data[1];
|
||||||
|
|
|
@ -518,8 +518,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
|
||||||
} #endregion
|
} #endregion
|
||||||
|
|
||||||
static doUpdate = function(frame = CURRENT_FRAME) { #region
|
static doUpdate = function(frame = CURRENT_FRAME) { #region
|
||||||
if(SAFE_MODE) return;
|
if(PROJECT.safeMode) return;
|
||||||
if(NODE_EXTRACT) return;
|
if(NODE_EXTRACT) return;
|
||||||
|
|
||||||
var render_timer = get_timer();
|
var render_timer = get_timer();
|
||||||
|
|
||||||
|
@ -1008,6 +1008,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x
|
||||||
}
|
}
|
||||||
|
|
||||||
var len = array_length(_inputs);
|
var len = array_length(_inputs);
|
||||||
|
|
||||||
for( var i = 0; i < len; i++ )
|
for( var i = 0; i < len; i++ )
|
||||||
_inputs[i].drawLineIndex = 1 + (i > len / 2? (len - 1 - i) : i) * 0.5;
|
_inputs[i].drawLineIndex = 1 + (i > len / 2? (len - 1 - i) : i) * 0.5;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,8 @@ function Node_create_Export(_x, _y, _group = noone) {
|
||||||
path = get_save_filename(@"Portable Network Graphics (.png)|*.png|
|
path = get_save_filename(@"Portable Network Graphics (.png)|*.png|
|
||||||
Joint Photographic Experts Group (.jpg)|*.jpg|
|
Joint Photographic Experts Group (.jpg)|*.jpg|
|
||||||
Graphics Interchange Format (.gif)|*.gif|
|
Graphics Interchange Format (.gif)|*.gif|
|
||||||
Animated WebP (.webp)|*.webp",
|
Animated WebP (.webp)|*.webp|
|
||||||
|
MPEG-4 (.mp4)|*.mp4",
|
||||||
"export");
|
"export");
|
||||||
|
|
||||||
key_release();
|
key_release();
|
||||||
|
@ -38,7 +39,7 @@ function exportAll() {
|
||||||
enum NODE_EXPORT_FORMAT {
|
enum NODE_EXPORT_FORMAT {
|
||||||
single,
|
single,
|
||||||
sequence,
|
sequence,
|
||||||
gif,
|
animation,
|
||||||
}
|
}
|
||||||
|
|
||||||
function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
|
function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
|
||||||
|
@ -95,14 +96,14 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
.rejectArray();
|
.rejectArray();
|
||||||
|
|
||||||
format_image = [ ".png", ".jpg", ".webp" ];
|
format_image = [ ".png", ".jpg", ".webp" ];
|
||||||
format_animation = [ ".gif", ".webp" ];
|
format_animation = [ ".gif", ".webp", ".mp4" ];
|
||||||
|
|
||||||
inputs[| 9] = nodeValue("Format", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
|
inputs[| 9] = nodeValue("Format", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
|
||||||
.setDisplay(VALUE_DISPLAY.enum_scroll, { data: format_image, update_hover: false })
|
.setDisplay(VALUE_DISPLAY.enum_scroll, { data: format_image, update_hover: false })
|
||||||
.rejectArray();
|
.rejectArray();
|
||||||
|
|
||||||
inputs[| 10] = nodeValue("Quality", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 80)
|
inputs[| 10] = nodeValue("Quality", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 80)
|
||||||
.setDisplay(VALUE_DISPLAY.slider, { range: [0, 100, 1] })
|
.setDisplay(VALUE_DISPLAY.slider, { range: [ 0, 100, 1 ] })
|
||||||
.rejectArray();
|
.rejectArray();
|
||||||
|
|
||||||
inputs[| 11] = nodeValue("Sequence begin", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0);
|
inputs[| 11] = nodeValue("Sequence begin", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0);
|
||||||
|
@ -206,17 +207,23 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
["Quality", false], 6, 7, 10, 13,
|
["Quality", false], 6, 7, 10, 13,
|
||||||
];
|
];
|
||||||
|
|
||||||
directory = DIRECTORY + "temp/" + string(irandom_range(100000, 999999));
|
directory = TEMPDIR + string(irandom_range(100000, 999999));
|
||||||
converter = working_directory + "ImageMagick/convert.exe";
|
converter = filepath_resolve(PREFERENCES.ImageMagick_path) + "convert.exe";
|
||||||
magick = working_directory + "ImageMagick/magick.exe";
|
magick = filepath_resolve(PREFERENCES.ImageMagick_path) + "magick.exe";
|
||||||
webp = working_directory + "webp/webpmux.exe";
|
webp = filepath_resolve(PREFERENCES.webp_path) + "webpmux.exe";
|
||||||
gifski = working_directory + "gifski/win/gifski.exe";
|
gifski = filepath_resolve(PREFERENCES.gifski_path) + "win/gifski.exe";
|
||||||
|
ffmpeg = filepath_resolve(PREFERENCES.ffmpeg_path) + "bin/ffmpeg.exe";
|
||||||
|
|
||||||
|
if(!file_exists(converter) || !file_exists(magick)) noti_warning("No ImageMagick deteced, please make sure the installation is complete and ImageMagick path is set properly in preference.");
|
||||||
|
if(!file_exists(webp)) noti_warning("No webp deteced, please make sure the installation is complete and webp path is set properly in preference.");
|
||||||
|
if(!file_exists(gifski)) noti_warning("No gifski deteced, please make sure the installation is complete and gifski path is set properly in preference.");
|
||||||
|
if(!file_exists(ffmpeg)) noti_warning("No ffmpeg deteced, please make sure the installation is complete and ffmpeg path is set properly in preference.");
|
||||||
|
|
||||||
static onValueUpdate = function(_index) { #region
|
static onValueUpdate = function(_index) { #region
|
||||||
var form = getInputData(3);
|
var form = getInputData(3);
|
||||||
|
|
||||||
if(_index == 3) {
|
if(_index == 3) {
|
||||||
inputs[| 9].setValue(0);
|
if(NOT_LOAD) inputs[| 9].setValue(0);
|
||||||
|
|
||||||
switch(form) {
|
switch(form) {
|
||||||
case 0 :
|
case 0 :
|
||||||
|
@ -229,10 +236,10 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_index == 3 && form == 1)
|
if(NOT_LOAD && _index == 3 && form == 1)
|
||||||
inputs[| 2].setValue("%d%n%3f%i");
|
inputs[| 2].setValue("%d%n%3f%i");
|
||||||
|
|
||||||
if(_index == 1) {
|
if(NOT_LOAD && _index == 1) {
|
||||||
var _path = getInputData(1);
|
var _path = getInputData(1);
|
||||||
var _ext = filename_ext(_path);
|
var _ext = filename_ext(_path);
|
||||||
|
|
||||||
|
@ -343,6 +350,26 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
PANEL_MENU.setNotiIcon(THEME.noti_icon_tick);
|
PANEL_MENU.setNotiIcon(THEME.noti_icon_tick);
|
||||||
} #endregion
|
} #endregion
|
||||||
|
|
||||||
|
static renderMp4 = function(temp_path, target_path) { #region
|
||||||
|
var rate = getInputData( 8);
|
||||||
|
if(rate == 0) rate = 1;
|
||||||
|
|
||||||
|
if(file_exists(target_path)) file_delete(target_path);
|
||||||
|
|
||||||
|
temp_path = string_replace_all(temp_path, "/", "\\");
|
||||||
|
target_path = string_replace_all(target_path, "/", "\\");
|
||||||
|
|
||||||
|
var shell_cmd = $"-hide_banner -loglevel quiet -framerate {rate} -i {temp_path}%05d.png -c:v libx264 -r {rate} -pix_fmt yuv420p {target_path}";
|
||||||
|
|
||||||
|
shell_execute_async(ffmpeg, shell_cmd, self);
|
||||||
|
|
||||||
|
var noti = log_message("EXPORT", "Export mp4 as " + target_path, THEME.noti_icon_tick, COLORS._main_value_positive, false);
|
||||||
|
noti.path = filename_dir(target_path);
|
||||||
|
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
|
||||||
|
|
||||||
|
PANEL_MENU.setNotiIcon(THEME.noti_icon_tick);
|
||||||
|
} #endregion
|
||||||
|
|
||||||
static pathString = function(path, index = 0, _array = false) { #region
|
static pathString = function(path, index = 0, _array = false) { #region
|
||||||
var suff = getInputData( 2);
|
var suff = getInputData( 2);
|
||||||
var form = getInputData( 3);
|
var form = getInputData( 3);
|
||||||
|
@ -448,7 +475,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
static save_surface = function(_surf, _path) { #region
|
static save_surface = function(_surf, _path) { #region
|
||||||
var form = getInputData(3);
|
var form = getInputData(3);
|
||||||
|
|
||||||
if(form == NODE_EXPORT_FORMAT.gif) {
|
if(form == NODE_EXPORT_FORMAT.animation) {
|
||||||
surface_save_safe(_surf, _path);
|
surface_save_safe(_surf, _path);
|
||||||
return _path;
|
return _path;
|
||||||
}
|
}
|
||||||
|
@ -528,7 +555,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
var _surf = surf[i];
|
var _surf = surf[i];
|
||||||
if(!is_surface(_surf)) continue;
|
if(!is_surface(_surf)) continue;
|
||||||
|
|
||||||
if(form == NODE_EXPORT_FORMAT.gif) {
|
if(form == NODE_EXPORT_FORMAT.animation) {
|
||||||
p = $"{directory}/{i}/{string_lead_zero(CURRENT_FRAME, 5)}.png";
|
p = $"{directory}/{i}/{string_lead_zero(CURRENT_FRAME, 5)}.png";
|
||||||
} else {
|
} else {
|
||||||
if(is_array(path) && array_length(path) == array_length(surf))
|
if(is_array(path) && array_length(path) == array_length(surf))
|
||||||
|
@ -540,7 +567,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
p = save_surface(_surf, p);
|
p = save_surface(_surf, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(form != NODE_EXPORT_FORMAT.gif) {
|
if(form != NODE_EXPORT_FORMAT.animation) {
|
||||||
var noti = log_message("EXPORT", "Export " + string(array_length(surf)) + " images complete.", THEME.noti_icon_tick, COLORS._main_value_positive, false);
|
var noti = log_message("EXPORT", "Export " + string(array_length(surf)) + " images complete.", THEME.noti_icon_tick, COLORS._main_value_positive, false);
|
||||||
noti.path = filename_dir(p);
|
noti.path = filename_dir(p);
|
||||||
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
|
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
|
||||||
|
@ -551,14 +578,14 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
var p = path;
|
var p = path;
|
||||||
if(is_array(path)) p = path[0];
|
if(is_array(path)) p = path[0];
|
||||||
|
|
||||||
if(form == NODE_EXPORT_FORMAT.gif)
|
if(form == NODE_EXPORT_FORMAT.animation)
|
||||||
p = $"{directory}/{string_lead_zero(CURRENT_FRAME, 5)}.png";
|
p = $"{directory}/{string_lead_zero(CURRENT_FRAME, 5)}.png";
|
||||||
else
|
else
|
||||||
p = pathString(p);
|
p = pathString(p);
|
||||||
|
|
||||||
p = save_surface(surf, p);
|
p = save_surface(surf, p);
|
||||||
|
|
||||||
if(form != NODE_EXPORT_FORMAT.gif) {
|
if(form != NODE_EXPORT_FORMAT.animation) {
|
||||||
var noti = log_message("EXPORT", "Export image as " + p, THEME.noti_icon_tick, COLORS._main_value_positive, false);
|
var noti = log_message("EXPORT", "Export image as " + p, THEME.noti_icon_tick, COLORS._main_value_positive, false);
|
||||||
noti.path = filename_dir(p);
|
noti.path = filename_dir(p);
|
||||||
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
|
noti.setOnClick(function() { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
|
||||||
|
@ -581,23 +608,37 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
if(is_array(path)) target_path = pathString(array_safe_get(path, i), i);
|
if(is_array(path)) target_path = pathString(array_safe_get(path, i), i);
|
||||||
else target_path = pathString(path, i);
|
else target_path = pathString(path, i);
|
||||||
|
|
||||||
if(extd == 0) {
|
switch(extd) {
|
||||||
target_path = string_replace(target_path, ".png", ".gif");
|
case 0 :
|
||||||
renderGif(string_quote(temp_path), string_quote(target_path));
|
target_path = string_replace(target_path, ".png", ".gif");
|
||||||
} else if(extd == 1) {
|
renderGif(string_quote(temp_path), string_quote(target_path));
|
||||||
target_path = string_replace(target_path, ".png", ".webp");
|
break;
|
||||||
renderWebp(temp_path, target_path);
|
case 1 :
|
||||||
|
target_path = string_replace(target_path, ".png", ".webp");
|
||||||
|
renderWebp(temp_path, target_path);
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
|
target_path = string_replace(target_path, ".png", ".mp4");
|
||||||
|
renderMp4(temp_path, target_path);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
target_path = pathString(path);
|
target_path = pathString(path);
|
||||||
|
|
||||||
if(extd == 0) {
|
switch(extd) {
|
||||||
target_path = string_replace(target_path, ".png", ".gif");
|
case 0 :
|
||||||
renderGif(string_quote(directory + "/*.png"), string_quote(target_path));
|
target_path = string_replace(target_path, ".png", ".gif");
|
||||||
} else if(extd == 1) {
|
renderGif(string_quote(directory + "/*.png"), string_quote(target_path));
|
||||||
target_path = string_replace(target_path, ".png", ".webp");
|
break;
|
||||||
renderWebp(directory + "/", target_path);
|
case 1 :
|
||||||
|
target_path = string_replace(target_path, ".png", ".webp");
|
||||||
|
renderWebp(directory + "/", target_path);
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
|
target_path = string_replace(target_path, ".png", ".mp4");
|
||||||
|
renderMp4(directory + "/", target_path);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -663,9 +704,9 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
var anim = getInputData(3); // single, sequence, animation
|
var anim = getInputData(3); // single, sequence, animation
|
||||||
var extn = getInputData(9);
|
var extn = getInputData(9);
|
||||||
|
|
||||||
inputs[| 5].setVisible(anim == 2);
|
inputs[| 5].setVisible(anim == 2 && extn != 2);
|
||||||
inputs[| 6].setVisible(anim == 2);
|
inputs[| 6].setVisible(anim == 2 && extn != 2);
|
||||||
inputs[| 7].setVisible(anim == 2);
|
inputs[| 7].setVisible(anim == 2 && extn != 2);
|
||||||
inputs[| 8].setVisible(anim == 2);
|
inputs[| 8].setVisible(anim == 2);
|
||||||
inputs[| 11].setVisible(anim == 1);
|
inputs[| 11].setVisible(anim == 1);
|
||||||
inputs[| 12].setVisible(anim > 0);
|
inputs[| 12].setVisible(anim > 0);
|
||||||
|
@ -673,10 +714,10 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
inputs[| 13].setVisible(anim < 2);
|
inputs[| 13].setVisible(anim < 2);
|
||||||
inputs[| 14].setVisible(anim > 0);
|
inputs[| 14].setVisible(anim > 0);
|
||||||
|
|
||||||
if(anim == NODE_EXPORT_FORMAT.gif) {
|
if(anim == NODE_EXPORT_FORMAT.animation) {
|
||||||
inputs[| 9].display_data.data = format_animation;
|
inputs[| 9].display_data.data = format_animation;
|
||||||
inputs[| 9].editWidget.data_list = format_animation;
|
inputs[| 9].editWidget.data_list = format_animation;
|
||||||
inputs[| 10].setVisible(true);
|
inputs[| 10].setVisible(extn != 2);
|
||||||
} else {
|
} else {
|
||||||
inputs[| 9].display_data.data = format_image;
|
inputs[| 9].display_data.data = format_image;
|
||||||
inputs[| 9].editWidget.data_list = format_image;
|
inputs[| 9].editWidget.data_list = format_image;
|
||||||
|
@ -703,7 +744,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
||||||
|
|
||||||
export();
|
export();
|
||||||
|
|
||||||
if(CURRENT_FRAME == TOTAL_FRAMES - 1 && anim == NODE_EXPORT_FORMAT.gif)
|
if(CURRENT_FRAME == TOTAL_FRAMES - 1 && anim == NODE_EXPORT_FORMAT.animation)
|
||||||
renderCompleted();
|
renderCompleted();
|
||||||
} #endregion
|
} #endregion
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ output.color = surfaceColor;")
|
||||||
var vs = getInputData(0);
|
var vs = getInputData(0);
|
||||||
var fs = getInputData(1);
|
var fs = getInputData(1);
|
||||||
|
|
||||||
var _dir = DIRECTORY + "temp/";
|
var _dir = TEMPDIR;
|
||||||
directory_verify(_dir);
|
directory_verify(_dir);
|
||||||
|
|
||||||
var vs = @"
|
var vs = @"
|
||||||
|
|
|
@ -11,8 +11,7 @@ function Node_Iterator_Input(_x, _y, _group = noone) : Node_Group_Input(_x, _y,
|
||||||
outputs[| 0].getValueDefault = method(outputs[| 0], outputs[| 0].getValueRecursive); //Get value from outside loop
|
outputs[| 0].getValueDefault = method(outputs[| 0], outputs[| 0].getValueRecursive); //Get value from outside loop
|
||||||
|
|
||||||
outputs[| 0].getValueRecursive = function() {
|
outputs[| 0].getValueRecursive = function() {
|
||||||
//show_debug_message("iteration " + string(group.iterated));
|
if(!struct_has(group, "iterated"))
|
||||||
if(!variable_struct_exists(group, "iterated"))
|
|
||||||
return outputs[| 0].getValueDefault();
|
return outputs[| 0].getValueDefault();
|
||||||
|
|
||||||
var _node_output = noone;
|
var _node_output = noone;
|
||||||
|
|
|
@ -64,10 +64,12 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
|
||||||
|
|
||||||
inputs[| 24] = nodeValue("Random Blend", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white) );
|
inputs[| 24] = nodeValue("Random Blend", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white) );
|
||||||
|
|
||||||
|
inputs[| 25] = nodeValue("Invert", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false );
|
||||||
|
|
||||||
input_display_list = [
|
input_display_list = [
|
||||||
["Output", true], 0, 1,
|
["Output", true], 0, 1,
|
||||||
["Line data", false], 6, 7, 19, 2, 20,
|
["Line data", false], 6, 7, 19, 2, 20,
|
||||||
["Line settings", false], 17, 3, 11, 12, 8, 9, 13, 14,
|
["Line settings", false], 17, 3, 11, 12, 8, 25, 9, 13, 14,
|
||||||
["Wiggle", false], 4, 5,
|
["Wiggle", false], 4, 5,
|
||||||
["Render", false], 10, 24, 15, 16,
|
["Render", false], 10, 24, 15, 16,
|
||||||
["Texture", false], 18, 21, 22, 23,
|
["Texture", false], 18, 21, 22, 23,
|
||||||
|
@ -155,6 +157,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
|
||||||
var _texSca = _data[23];
|
var _texSca = _data[23];
|
||||||
|
|
||||||
var _colb = _data[24];
|
var _colb = _data[24];
|
||||||
|
var _ratInv = _data[25];
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
if(CURRENT_FRAME == 0 || inputs[| 11].is_anim)
|
if(CURRENT_FRAME == 0 || inputs[| 11].is_anim)
|
||||||
|
@ -251,14 +254,15 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
|
||||||
}
|
}
|
||||||
|
|
||||||
wght = 1;
|
wght = 1;
|
||||||
|
var _pathPng = _ratInv? 1 - _prog_curr : _prog_curr;
|
||||||
if(_useDistance) {
|
if(_useDistance) {
|
||||||
p = _pat.getPointDistance(_prog_curr, i, p);
|
p = _pat.getPointDistance(_pathPng, i, p);
|
||||||
if(struct_has(_pat, "getWeightRatio"))
|
if(struct_has(_pat, "getWeightRatio"))
|
||||||
wght = _pat.getWeightRatio(_prog_curr, i);
|
wght = _pat.getWeightRatio(_pathPng, i);
|
||||||
} else {
|
} else {
|
||||||
p = _pat.getPointRatio(_prog_curr, i, p);
|
p = _pat.getPointRatio(_pathPng, i, p);
|
||||||
if(struct_has(_pat, "getWeightDistance"))
|
if(struct_has(_pat, "getWeightDistance"))
|
||||||
wght = _pat.getWeightDistance(_prog_curr, i);
|
wght = _pat.getWeightDistance(_pathPng, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
_nx = p.x;
|
_nx = p.x;
|
||||||
|
|
|
@ -123,8 +123,10 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { #regio
|
||||||
var iter = ds_list_create(); #region
|
var iter = ds_list_create(); #region
|
||||||
addNodeCatagory("Loop", iter, ["Node_Iterate"]);
|
addNodeCatagory("Loop", iter, ["Node_Iterate"]);
|
||||||
ds_list_add(iter, "Groups");
|
ds_list_add(iter, "Groups");
|
||||||
addNodeObject(iter, "Input", s_node_loop_input, "Node_Iterator_Input", [1, Node_Iterator_Input]).hideRecent();
|
addNodeObject(iter, "Loop Input", s_node_loop_input, "Node_Iterator_Input", [1, Node_Iterator_Input]).hideRecent();
|
||||||
addNodeObject(iter, "Output", s_node_loop_output, "Node_Iterator_Output", [1, Node_Iterator_Output]).hideRecent();
|
addNodeObject(iter, "Loop Output", s_node_loop_output, "Node_Iterator_Output", [1, Node_Iterator_Output]).hideRecent();
|
||||||
|
addNodeObject(iter, "Input", s_node_group_input, "Node_Group_Input", [1, Node_Group_Input]).hideRecent();
|
||||||
|
addNodeObject(iter, "Output", s_node_group_output, "Node_Group_Output", [1, Node_Group_Output]).hideRecent();
|
||||||
addNodeObject(iter, "Thumbnail", s_node_group_thumbnail, "Node_Group_Thumbnail", [1, Node_Group_Thumbnail]).hideRecent();
|
addNodeObject(iter, "Thumbnail", s_node_group_thumbnail, "Node_Group_Thumbnail", [1, Node_Group_Thumbnail]).hideRecent();
|
||||||
|
|
||||||
ds_list_add(iter, "Loops");
|
ds_list_add(iter, "Loops");
|
||||||
|
|
|
@ -1564,7 +1564,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
|
||||||
animator.values[| 0].time = CURRENT_FRAME;
|
animator.values[| 0].time = CURRENT_FRAME;
|
||||||
|
|
||||||
for( var i = 0, n = array_length(animators); i < n; i++ ) {
|
for( var i = 0, n = array_length(animators); i < n; i++ ) {
|
||||||
ds_list_clear(animators[i].values);
|
|
||||||
animators[i].values[| 0].time = CURRENT_FRAME;
|
animators[i].values[| 0].time = CURRENT_FRAME;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2054,6 +2053,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
|
||||||
} #endregion
|
} #endregion
|
||||||
|
|
||||||
static drawConnections = function(params = {}) { #region
|
static drawConnections = function(params = {}) { #region
|
||||||
|
var log = struct_try_get(params, "log", false);
|
||||||
|
|
||||||
if(isLeaf()) return noone;
|
if(isLeaf()) return noone;
|
||||||
if(!value_from.node.active) return noone;
|
if(!value_from.node.active) return noone;
|
||||||
if(!isVisible()) return noone;
|
if(!isVisible()) return noone;
|
||||||
|
@ -2068,10 +2069,6 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
|
||||||
var max_layer = params.max_layer;
|
var max_layer = params.max_layer;
|
||||||
|
|
||||||
var aa = struct_try_get(params, "aa", 1);
|
var aa = struct_try_get(params, "aa", 1);
|
||||||
var minx = struct_try_get(params, "minx", undefined);
|
|
||||||
var miny = struct_try_get(params, "miny", undefined);
|
|
||||||
var maxx = struct_try_get(params, "maxx", undefined);
|
|
||||||
var maxy = struct_try_get(params, "maxy", undefined);
|
|
||||||
var high = struct_try_get(params, "highlight", 0);
|
var high = struct_try_get(params, "highlight", 0);
|
||||||
|
|
||||||
var bg = struct_try_get(params, "bg", c_black);
|
var bg = struct_try_get(params, "bg", c_black);
|
||||||
|
@ -2083,7 +2080,12 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
|
||||||
var frx = value_from.x;
|
var frx = value_from.x;
|
||||||
var fry = value_from.y;
|
var fry = value_from.y;
|
||||||
|
|
||||||
if(!is_undefined(minx)) {
|
if(struct_has(params, "minx")) {
|
||||||
|
var minx = params.minx;
|
||||||
|
var miny = params.miny;
|
||||||
|
var maxx = params.maxx;
|
||||||
|
var maxy = params.maxy;
|
||||||
|
|
||||||
if(jx < minx && frx < minx) return noone;
|
if(jx < minx && frx < minx) return noone;
|
||||||
if(jx > maxx && frx > maxx) return noone;
|
if(jx > maxx && frx > maxx) return noone;
|
||||||
|
|
||||||
|
|
|
@ -1760,7 +1760,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var path = DIRECTORY + "temp/url_pasted_" + string(irandom_range(100000, 999999)) + ".png";
|
var path = TEMPDIR + "url_pasted_" + string(irandom_range(100000, 999999)) + ".png";
|
||||||
var img = http_get_file(txt, path);
|
var img = http_get_file(txt, path);
|
||||||
CLONING = true;
|
CLONING = true;
|
||||||
var node = Node_create_Image(0, 0);
|
var node = Node_create_Image(0, 0);
|
||||||
|
|
|
@ -100,10 +100,11 @@ function graph_export_image(allList, nodeList, settings = {}) {
|
||||||
max_layer : 1,
|
max_layer : 1,
|
||||||
cur_layer : 1,
|
cur_layer : 1,
|
||||||
highlight : false,
|
highlight : false,
|
||||||
|
log: true
|
||||||
};
|
};
|
||||||
|
|
||||||
for(var i = 0; i < ds_list_size(nodeList); i++)
|
for(var i = 0; i < ds_list_size(nodeList); i++)
|
||||||
nodeList[| i].drawConnections(_params);
|
nodeList[| i].drawConnections(_params, true);
|
||||||
surface_reset_target();
|
surface_reset_target();
|
||||||
|
|
||||||
shader_set(sh_downsample);
|
shader_set(sh_downsample);
|
||||||
|
|
|
@ -17,7 +17,8 @@ function Panel_Menu() : PanelContent() constructor {
|
||||||
|
|
||||||
menu_file_nondemo = [
|
menu_file_nondemo = [
|
||||||
menuItem(__txt("New"), function() { NEW(); }, THEME.new_file, ["", "New file"]),
|
menuItem(__txt("New"), function() { NEW(); }, THEME.new_file, ["", "New file"]),
|
||||||
menuItem(__txt("Open") + "...", function() { LOAD(); }, THEME.noti_icon_file_load, ["", "Open"]),
|
menuItem(__txt("Open") + "...", function() { LOAD(); }, THEME.noti_icon_file_load, ["", "Open"])
|
||||||
|
.setShiftMenu(menuItem(__txt("Open in safe mode") + "...", function() { LOAD(true); }, THEME.noti_icon_file_load)),
|
||||||
menuItem(__txt("Save"), function() { SAVE(); }, THEME.save, ["", "Save"]),
|
menuItem(__txt("Save"), function() { SAVE(); }, THEME.save, ["", "Save"]),
|
||||||
menuItem(__txt("Save as") + "...", function() { SAVE_AS(); }, THEME.save, ["", "Save as"]),
|
menuItem(__txt("Save as") + "...", function() { SAVE_AS(); }, THEME.save, ["", "Save as"]),
|
||||||
menuItem(__txt("Save all"), function() { SAVE_ALL(); }, THEME.icon_save_all, ["", "Save all"]),
|
menuItem(__txt("Save all"), function() { SAVE_ALL(); }, THEME.icon_save_all, ["", "Save all"]),
|
||||||
|
@ -649,12 +650,11 @@ function Panel_Menu() : PanelContent() constructor {
|
||||||
|
|
||||||
#region title
|
#region title
|
||||||
var txt = "";
|
var txt = "";
|
||||||
if(PROJECT.path == "")
|
if(PROJECT.safeMode) txt += "[SAFE MODE] ";
|
||||||
txt = "Untitled";
|
if(PROJECT.readonly) txt += "[READ ONLY] ";
|
||||||
else
|
|
||||||
txt = filename_name(PROJECT.path);
|
txt += PROJECT.path == ""? "Untitled" : filename_name(PROJECT.path);
|
||||||
if(PROJECT.modified)
|
if(PROJECT.modified) txt += "*";
|
||||||
txt += "*";
|
|
||||||
txt += " - Pixel Composer";
|
txt += " - Pixel Composer";
|
||||||
if(ALPHA) txt += " ALPHA";
|
if(ALPHA) txt += " ALPHA";
|
||||||
else if(DEMO) txt += " DEMO";
|
else if(DEMO) txt += " DEMO";
|
||||||
|
|
|
@ -73,6 +73,12 @@
|
||||||
PREFERENCES.clear_temp_on_close = true;
|
PREFERENCES.clear_temp_on_close = true;
|
||||||
PREFERENCES.pan_mouse_key = mb_middle;
|
PREFERENCES.pan_mouse_key = mb_middle;
|
||||||
|
|
||||||
|
PREFERENCES.temp_path = "%DIR%/temp/";
|
||||||
|
PREFERENCES.ImageMagick_path = "%APP%/ImageMagick/";
|
||||||
|
PREFERENCES.webp_path = "%APP%/webp/";
|
||||||
|
PREFERENCES.gifski_path = "%APP%/gifski/";
|
||||||
|
PREFERENCES.ffmpeg_path = "%APP%/ffmpeg/";
|
||||||
|
|
||||||
PREFERENCES_DEF = variable_clone(PREFERENCES);
|
PREFERENCES_DEF = variable_clone(PREFERENCES);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -186,6 +192,8 @@
|
||||||
struct_override(HOTKEYS_CUSTOM, f);
|
struct_override(HOTKEYS_CUSTOM, f);
|
||||||
|
|
||||||
LOCALE_USE_DEFAULT = PREFERENCES.local == "en";
|
LOCALE_USE_DEFAULT = PREFERENCES.local == "en";
|
||||||
|
|
||||||
|
directory_verify(filepath_resolve(PREFERENCES.temp_path));
|
||||||
}
|
}
|
||||||
|
|
||||||
function PREF_APPLY() {
|
function PREF_APPLY() {
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
modified = false; /// @is {bool}
|
modified = false; /// @is {bool}
|
||||||
readonly = false; /// @is {bool}
|
readonly = false; /// @is {bool}
|
||||||
|
safeMode = false;
|
||||||
|
|
||||||
nodes = ds_list_create();
|
nodes = ds_list_create();
|
||||||
nodeMap = ds_map_create();
|
nodeMap = ds_map_create();
|
||||||
|
|
|
@ -17,3 +17,17 @@ function shell_execute(path, command, ref = noone) {
|
||||||
if(global.PROC_ID == 0) noti_warning($"Execute shell failed: {e}", THEME.noti_icon_console_failed, COLORS._main_value_negative, ref);
|
if(global.PROC_ID == 0) noti_warning($"Execute shell failed: {e}", THEME.noti_icon_console_failed, COLORS._main_value_negative, ref);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function shell_execute_async(path, command, ref = noone) {
|
||||||
|
gml_pragma("forceinline");
|
||||||
|
|
||||||
|
var txt = $"{path} {command}";
|
||||||
|
if(global.PROC_ID == 0) noti_status(txt, THEME.noti_icon_console,, ref);
|
||||||
|
|
||||||
|
try {
|
||||||
|
var res = ProcessExecuteAsync(txt);
|
||||||
|
if(global.PROC_ID == 0) noti_status("Execute shell complete", THEME.noti_icon_console,, ref);
|
||||||
|
} catch(e) {
|
||||||
|
if(global.PROC_ID == 0) noti_warning($"Execute shell failed: {e}", THEME.noti_icon_console_failed, COLORS._main_value_negative, ref);
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,7 +11,7 @@ function slider(_min, _max, _step, _onModify = noone, _onRelease = noone) : widg
|
||||||
|
|
||||||
current_value = 0;
|
current_value = 0;
|
||||||
|
|
||||||
onModify = _onModify;
|
onModify = _onModify;
|
||||||
onRelease = _onRelease;
|
onRelease = _onRelease;
|
||||||
onApply = function(val) {
|
onApply = function(val) {
|
||||||
if(onModify) onModify(val);
|
if(onModify) onModify(val);
|
||||||
|
|
|
@ -7,4 +7,9 @@ function textInput(_input, _onModify) : widget() constructor {
|
||||||
static _resetFocus = function() { resetFocus(); }
|
static _resetFocus = function() { resetFocus(); }
|
||||||
|
|
||||||
static onKey = function(key) {}
|
static onKey = function(key) {}
|
||||||
|
|
||||||
|
static setSideButton = function(_button) {
|
||||||
|
self.side_button = _button;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
function close_program() {
|
function close_program() {
|
||||||
PREF_SAVE();
|
PREF_SAVE();
|
||||||
if(PREFERENCES.clear_temp_on_close) directory_destroy(DIRECTORY + "temp");
|
if(PREFERENCES.clear_temp_on_close) directory_destroy(TEMPDIR);
|
||||||
game_end();
|
game_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue