Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Patch for FFMPEG to fix broken channel disabling behavior
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index b9c0f7a..6a60891 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -4916,23 +4916,43 @@ static void enable_tracks(AVFormatContext *s)
st->codec->codec_type >= AVMEDIA_TYPE_NB)
continue;
+ // note the first stream number for each type
if (first[st->codec->codec_type] < 0)
first[st->codec->codec_type] = i;
- if (st->disposition & AV_DISPOSITION_DEFAULT) {
- mov->tracks[i].flags |= MOV_TRACK_ENABLED;
- enabled[st->codec->codec_type]++;
- }
+
+ // note whether each media type has any enabled streams
+ if (st->disposition & AV_DISPOSITION_DEFAULT)
+ enabled[st->codec->codec_type] = 1;
+
+ // clear the enables for each stream and track
+ st->disposition &= ~AV_DISPOSITION_DEFAULT;
+ mov->tracks[i].flags &= ~MOV_TRACK_ENABLED;
}
+ // for each media type, if no stream was explicitly enabled
+ // then enable the first one found for that type
for (i = 0; i < AVMEDIA_TYPE_NB; i++) {
switch (i) {
case AVMEDIA_TYPE_VIDEO:
case AVMEDIA_TYPE_AUDIO:
case AVMEDIA_TYPE_SUBTITLE:
- if (enabled[i] > 1)
- mov->per_stream_grouping = 1;
if (!enabled[i] && first[i] >= 0)
+ enabled[i] = 1;
+ break;
+ }
+ }
+
+ // translate the first enabled stream of each media type
+ // into its stream being default and its output track being enabled
+ for (i = 0; i < AVMEDIA_TYPE_NB; i++) {
+ switch (i) {
+ case AVMEDIA_TYPE_VIDEO:
+ case AVMEDIA_TYPE_AUDIO:
+ case AVMEDIA_TYPE_SUBTITLE:
+ if (enabled[i]) {
+ s->streams[first[i]]->disposition |= AV_DISPOSITION_DEFAULT;
mov->tracks[first[i]].flags |= MOV_TRACK_ENABLED;
+ }
break;
}
}
class Ffmpeg < Formula
desc "Play, record, convert, and stream audio and video"
homepage "https://ffmpeg.org/"
url "https://ffmpeg.org/releases/ffmpeg-3.0.tar.bz2"
sha256 "f19ff77a2f7f736a41dd1499eef4784bf3cb7461f07c13a268164823590113c0"
head "https://github.com/FFmpeg/FFmpeg.git"
patch do
url "https://gist.githubusercontent.com/outlyer/4a88f1adb7f895b93fd9/raw/17acf54adbdc51c8f0a24338e49e11d682231c96/ffmpeg-3.0-defaultstreams.patch"
sha256 "6d2f96e04624a9b3af0408000e0455d8f291e2df3e75c47429d2e9c1851ebb9f"
end
option "without-x264", "Disable H.264 encoder"
option "without-lame", "Disable MP3 encoder"
option "without-libvo-aacenc", "Disable VisualOn AAC encoder"
option "without-xvid", "Disable Xvid MPEG-4 video encoder"
option "without-qtkit", "Disable deprecated QuickTime framework"
option "with-rtmpdump", "Enable RTMP protocol"
option "with-libass", "Enable ASS/SSA subtitle format"
option "with-opencore-amr", "Enable Opencore AMR NR/WB audio format"
option "with-openjpeg", "Enable JPEG 2000 image format"
option "with-openssl", "Enable SSL support"
option "with-libssh", "Enable SFTP protocol via libssh"
option "with-schroedinger", "Enable Dirac video format"
option "with-ffplay", "Enable FFplay media player"
option "with-tools", "Enable additional FFmpeg tools"
option "with-fdk-aac", "Enable the Fraunhofer FDK AAC library"
option "with-libvidstab", "Enable vid.stab support for video stabilization"
option "with-x265", "Enable x265 encoder"
option "with-libsoxr", "Enable the soxr resample library"
option "with-webp", "Enable using libwebp to encode WEBP images"
option "with-zeromq", "Enable using libzeromq to receive commands sent through a libzeromq client"
depends_on "pkg-config" => :build
# manpages won't be built without texi2html
depends_on "texi2html" => :build
depends_on "yasm" => :build
depends_on "x264" => :recommended
depends_on "lame" => :recommended
depends_on "libvo-aacenc" => :recommended
depends_on "xvid" => :recommended
depends_on "faac" => :optional
depends_on "fontconfig" => :optional
depends_on "freetype" => :optional
depends_on "theora" => :optional
depends_on "libvorbis" => :optional
depends_on "libvpx" => :optional
depends_on "rtmpdump" => :optional
depends_on "opencore-amr" => :optional
depends_on "libass" => :optional
depends_on "openjpeg" => :optional
depends_on "sdl" if build.with? "ffplay"
depends_on "speex" => :optional
depends_on "schroedinger" => :optional
depends_on "fdk-aac" => :optional
depends_on "opus" => :optional
depends_on "frei0r" => :optional
depends_on "libcaca" => :optional
depends_on "libbluray" => :optional
depends_on "libsoxr" => :optional
depends_on "libquvi" => :optional
depends_on "libvidstab" => :optional
depends_on "x265" => :optional
depends_on "openssl" => :optional
depends_on "libssh" => :optional
depends_on "webp" => :optional
depends_on "zeromq" => :optional
def install
args = ["--prefix=#{prefix}",
"--enable-shared",
"--enable-pthreads",
"--enable-gpl",
"--enable-version3",
"--enable-hardcoded-tables",
"--enable-avresample",
"--cc=#{ENV.cc}",
"--host-cflags=#{ENV.cflags}",
"--host-ldflags=#{ENV.ldflags}"
]
args << "--enable-opencl" if MacOS.version > :lion
args << "--enable-libx264" if build.with? "x264"
args << "--enable-libmp3lame" if build.with? "lame"
args << "--enable-libvo-aacenc" if build.with? "libvo-aacenc"
args << "--enable-libxvid" if build.with? "xvid"
args << "--enable-libfontconfig" if build.with? "fontconfig"
args << "--enable-libfreetype" if build.with? "freetype"
args << "--enable-libtheora" if build.with? "theora"
args << "--enable-libvorbis" if build.with? "libvorbis"
args << "--enable-libvpx" if build.with? "libvpx"
args << "--enable-librtmp" if build.with? "rtmpdump"
args << "--enable-libopencore-amrnb" << "--enable-libopencore-amrwb" if build.with? "opencore-amr"
args << "--enable-libfaac" if build.with? "faac"
args << "--enable-libass" if build.with? "libass"
args << "--enable-ffplay" if build.with? "ffplay"
args << "--enable-libssh" if build.with? "libssh"
args << "--enable-libspeex" if build.with? "speex"
args << "--enable-libschroedinger" if build.with? "schroedinger"
args << "--enable-libfdk-aac" if build.with? "fdk-aac"
args << "--enable-openssl" if build.with? "openssl"
args << "--enable-libopus" if build.with? "opus"
args << "--enable-frei0r" if build.with? "frei0r"
args << "--enable-libcaca" if build.with? "libcaca"
args << "--enable-libsoxr" if build.with? "libsoxr"
args << "--enable-libquvi" if build.with? "libquvi"
args << "--enable-libvidstab" if build.with? "libvidstab"
args << "--enable-libx265" if build.with? "x265"
args << "--enable-libwebp" if build.with? "webp"
args << "--enable-libzmq" if build.with? "zeromq"
args << "--disable-indev=qtkit" if build.without? "qtkit"
if build.with? "openjpeg"
args << "--enable-libopenjpeg"
args << "--disable-decoder=jpeg2000"
args << "--extra-cflags=" + `pkg-config --cflags libopenjpeg`.chomp
end
# These librares are GPL-incompatible, and require ffmpeg be built with
# the "--enable-nonfree" flag, which produces unredistributable libraries
if %w[faac fdk-aac openssl].any? { |f| build.with? f }
args << "--enable-nonfree"
end
# A bug in a dispatch header on 10.10, included via CoreFoundation,
# prevents GCC from building VDA support. GCC has no problems on
# 10.9 and earlier.
# See: https://github.com/Homebrew/homebrew/issues/33741
if MacOS.version < :yosemite || ENV.compiler == :clang
args << "--enable-vda"
else
args << "--disable-vda"
end
# For 32-bit compilation under gcc 4.2, see:
# https://trac.macports.org/ticket/20938#comment:22
ENV.append_to_cflags "-mdynamic-no-pic" if Hardware.is_32_bit? && Hardware::CPU.intel? && ENV.compiler == :clang
system "./configure", *args
if MacOS.prefer_64_bit?
inreplace "config.mak" do |s|
shflags = s.get_make_var "SHFLAGS"
if shflags.gsub!(" -Wl,-read_only_relocs,suppress", "")
s.change_make_var! "SHFLAGS", shflags
end
end
end
system "make", "install"
if build.with? "tools"
system "make", "alltools"
bin.install Dir["tools/*"].select { |f| File.executable? f }
end
end
def caveats
if build.without? "faac" then <<-EOS.undent
FFmpeg has been built without libfaac for licensing reasons;
libvo-aacenc is used by default.
To install with libfaac, you can:
brew reinstall ffmpeg --with-faac
You can also use the experimental FFmpeg encoder, libfdk-aac, or
libvo_aacenc to encode AAC audio:
ffmpeg -i input.wav -c:a aac -strict experimental output.m4a
Or:
brew reinstall ffmpeg --with-fdk-aac
ffmpeg -i input.wav -c:a libfdk_aac output.m4a
EOS
end
end
test do
# Create an example mp4 file
system "#{bin}/ffmpeg", "-y", "-filter_complex",
"testsrc=rate=1:duration=1", "#{testpath}/video.mp4"
assert (testpath/"video.mp4").exist?
end
end
@outlyer

This comment has been minimized.

Copy link
Owner Author

outlyer commented Aug 18, 2014

Patch still applies and works with 2.2.x series so formula is updated.

@outlyer

This comment has been minimized.

Copy link
Owner Author

outlyer commented Aug 21, 2014

Updated to apply to ffmpeg 2.3.3, seems to work on my end.

@outlyer

This comment has been minimized.

Copy link
Owner Author

outlyer commented Oct 19, 2014

Updated to 2.4.2 and merged with newer Yosemite formula

@outlyer

This comment has been minimized.

Copy link
Owner Author

outlyer commented Dec 5, 2014

Updated to 2.5, patch still works which is good. Bug still exists which is bad.

@outlyer

This comment has been minimized.

Copy link
Owner Author

outlyer commented Mar 7, 2015

Updated to 2.6; patch still works fine.

@tessus

This comment has been minimized.

Copy link

tessus commented Apr 10, 2015

Hello. Can you please send your patch to the ffmpeg-dev mailing list? Just use the subject: patch for #3622.
Otherwise I fear it will never make it into the code...

@outlyer

This comment has been minimized.

Copy link
Owner Author

outlyer commented Sep 9, 2015

I've updated the Homebrew formula again; patch still works. I've submitted the patch before but there is some debate about whether this is the correct solution.

See trac.ffmpeg.org

The fix proposed and executed in this ticket works for a specific workflow. However there are other
workflows that require all audio tracks to be enabled upon the MOV being created such as delivery to
iTunes, or Netflix, or professional post production facilities internal workflows. I would like to propose (if
it's possible) to have some type of switch in the code allowing someone to tell FFMPEG to either make
only track 1 enabled or to make all tracks enabled.

The command-line structure used by ffmpeg is pretty opaque to me, so I don't think I'd be able to write something in line with their design.

@outlyer

This comment has been minimized.

Copy link
Owner Author

outlyer commented Sep 10, 2015

Created a new patch so we don't get the annoying error. Also update the formula to match.

patch unexpectedly ends in middle of line
@drazin

This comment has been minimized.

Copy link

drazin commented May 27, 2016

does this work still? if so, i wonder if you can provide a patched .exe so people in need can easily use it. thanks!

@core-code

This comment has been minimized.

Copy link

core-code commented Nov 23, 2016

does not work anymore with 3.2 even when changing codec=>codecpar to get it to compile ... output file won't show video in VLC or QuickTime (because the video track of the resulting file is not 'enabled')

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.