• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash -eux
2# Copyright 2016 Google Inc.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#      http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16################################################################################
17
18# Disable UBSan vptr since several targets built with -fno-rtti.
19export CFLAGS="$CFLAGS -fno-sanitize=vptr"
20export CXXFLAGS="$CXXFLAGS -fno-sanitize=vptr"
21
22# Build dependencies.
23export FFMPEG_DEPS_PATH=$SRC/ffmpeg_deps
24mkdir -p $FFMPEG_DEPS_PATH
25
26export PATH="$FFMPEG_DEPS_PATH/bin:$PATH"
27export LD_LIBRARY_PATH="$FFMPEG_DEPS_PATH/lib"
28
29cd $SRC
30bzip2 -f -d alsa-lib-*
31tar xf alsa-lib-*
32rm alsa-lib-*.tar
33cd alsa-lib-*
34./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static --disable-shared
35make clean
36make -j$(nproc) all
37make install
38
39cd $SRC/fdk-aac
40autoreconf -fiv
41CXXFLAGS="$CXXFLAGS -fno-sanitize=shift-base,signed-integer-overflow" \
42./configure --prefix="$FFMPEG_DEPS_PATH" --disable-shared
43make clean
44make -j$(nproc) all
45make install
46
47cd $SRC/libXext
48./autogen.sh
49./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static
50make clean
51make -j$(nproc)
52make install
53
54cd $SRC/libva
55./autogen.sh
56./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static --disable-shared
57make clean
58make -j$(nproc) all
59make install
60
61cd $SRC/libvdpau
62./autogen.sh
63./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static --disable-shared
64make clean
65make -j$(nproc) all
66make install
67
68cd $SRC/libvpx
69LDFLAGS="$CXXFLAGS" ./configure --prefix="$FFMPEG_DEPS_PATH" \
70    --disable-examples --disable-unit-tests \
71    --size-limit=12288x12288 \
72    --extra-cflags="-DVPX_MAX_ALLOCABLE_MEMORY=1073741824"
73make clean
74make -j$(nproc) all
75make install
76
77cd $SRC/ogg
78./autogen.sh
79./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static --disable-crc
80make clean
81make -j$(nproc)
82make install
83
84cd $SRC/opus
85./autogen.sh
86./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static
87make clean
88make -j$(nproc) all
89make install
90
91cd $SRC/theora
92# theora requires ogg, need to pass its location to the "configure" script.
93CFLAGS="$CFLAGS -fPIC" LDFLAGS="-L$FFMPEG_DEPS_PATH/lib/" \
94    CPPFLAGS="$CXXFLAGS -I$FFMPEG_DEPS_PATH/include/" \
95    LD_LIBRARY_PATH="$FFMPEG_DEPS_PATH/lib/" \
96    ./autogen.sh
97./configure --with-ogg="$FFMPEG_DEPS_PATH" --prefix="$FFMPEG_DEPS_PATH" \
98    --enable-static --disable-examples
99make clean
100make -j$(nproc)
101make install
102
103cd $SRC/vorbis
104./autogen.sh
105./configure --prefix="$FFMPEG_DEPS_PATH" --enable-static
106make clean
107make -j$(nproc)
108make install
109
110# Remove shared libraries to avoid accidental linking against them.
111rm $FFMPEG_DEPS_PATH/lib/*.so
112rm $FFMPEG_DEPS_PATH/lib/*.so.*
113
114# Build ffmpeg.
115cd $SRC/ffmpeg
116PKG_CONFIG_PATH="$FFMPEG_DEPS_PATH/lib/pkgconfig" ./configure \
117    --cc=$CC --cxx=$CXX --ld="$CXX $CXXFLAGS -std=c++11" \
118    --extra-cflags="-I$FFMPEG_DEPS_PATH/include" \
119    --extra-ldflags="-L$FFMPEG_DEPS_PATH/lib" \
120    --prefix="$FFMPEG_DEPS_PATH" \
121    --pkg-config-flags="--static" \
122    --enable-ossfuzz \
123    --libfuzzer=$LIB_FUZZING_ENGINE \
124    --optflags=-O1 \
125    --enable-gpl \
126    --enable-libass \
127    --enable-libfdk-aac \
128    --enable-libfreetype \
129    --enable-libopus \
130    --enable-libtheora \
131    --enable-libvorbis \
132    --enable-libvpx \
133    --enable-nonfree \
134    --disable-muxers \
135    --disable-protocols \
136    --disable-demuxer=rtp,rtsp,sdp \
137    --disable-devices \
138    --disable-shared
139make clean
140make -j$(nproc) install
141
142# Download test samples, will be used as seed corpus.
143# DISABLED.
144# TODO: implement a better way to maintain a minimized seed corpora
145# for all targets. As of 2017-05-04 now the combined size of corpora
146# is too big for ClusterFuzz (over 10Gb compressed data).
147export TEST_SAMPLES_PATH=$SRC/ffmpeg/fate-suite/
148make fate-rsync SAMPLES=$TEST_SAMPLES_PATH
149
150# Build the fuzzers.
151cd $SRC/ffmpeg
152
153FUZZ_TARGET_SOURCE=$SRC/ffmpeg/tools/target_dec_fuzzer.c
154
155export TEMP_VAR_CODEC="AV_CODEC_ID_H264"
156export TEMP_VAR_CODEC_TYPE="VIDEO"
157
158CONDITIONALS=`grep 'BSF 1$' config.h | sed 's/#define CONFIG_\(.*\)_BSF 1/\1/'`
159if [ -n "${OSS_FUZZ_CI-}" ]; then
160  # When running in CI, check the first targets only to save time and disk space
161  CONDITIONALS=( ${CONDITIONALS[@]:0:2} )
162fi
163for c in $CONDITIONALS ; do
164  fuzzer_name=ffmpeg_BSF_${c}_fuzzer
165  symbol=`echo $c | sed "s/.*/\L\0/"`
166  echo -en "[libfuzzer]\nmax_len = 1000000\n" > $OUT/${fuzzer_name}.options
167  make tools/target_bsf_${symbol}_fuzzer
168  mv tools/target_bsf_${symbol}_fuzzer $OUT/${fuzzer_name}
169done
170
171# Build fuzzers for decoders.
172CONDITIONALS=`grep 'DECODER 1$' config.h | sed 's/#define CONFIG_\(.*\)_DECODER 1/\1/'`
173if [ -n "${OSS_FUZZ_CI-}" ]; then
174  # When running in CI, check the first targets only to save time and disk space
175  CONDITIONALS=( ${CONDITIONALS[@]:0:2} )
176fi
177for c in $CONDITIONALS ; do
178  fuzzer_name=ffmpeg_AV_CODEC_ID_${c}_fuzzer
179  symbol=`echo $c | sed "s/.*/\L\0/"`
180  echo -en "[libfuzzer]\nmax_len = 1000000\n" > $OUT/${fuzzer_name}.options
181  make tools/target_dec_${symbol}_fuzzer
182  mv tools/target_dec_${symbol}_fuzzer $OUT/${fuzzer_name}
183done
184
185# Build fuzzer for demuxer
186fuzzer_name=ffmpeg_DEMUXER_fuzzer
187echo -en "[libfuzzer]\nmax_len = 1000000\n" > $OUT/${fuzzer_name}.options
188make tools/target_dem_fuzzer
189mv tools/target_dem_fuzzer $OUT/${fuzzer_name}
190
191# We do not need raw reference files for the muxer
192rm `find fate-suite -name '*.s16'`
193rm `find fate-suite -name '*.dec'`
194rm `find fate-suite -name '*.pcm'`
195
196zip -r $OUT/${fuzzer_name}_seed_corpus.zip fate-suite
197zip -r $OUT/ffmpeg_AV_CODEC_ID_HEVC_fuzzer_seed_corpus.zip fate-suite/hevc fate-suite/hevc-conformance
198
199# Build fuzzer for demuxer fed at IO level
200fuzzer_name=ffmpeg_IO_DEMUXER_fuzzer
201make tools/target_io_dem_fuzzer
202mv tools/target_io_dem_fuzzer $OUT/${fuzzer_name}
203
204#Build fuzzers for individual demuxers
205PKG_CONFIG_PATH="$FFMPEG_DEPS_PATH/lib/pkgconfig" ./configure \
206    --cc=$CC --cxx=$CXX --ld="$CXX $CXXFLAGS -std=c++11" \
207    --extra-cflags="-I$FFMPEG_DEPS_PATH/include" \
208    --extra-ldflags="-L$FFMPEG_DEPS_PATH/lib" \
209    --prefix="$FFMPEG_DEPS_PATH" \
210    --pkg-config-flags="--static" \
211    --enable-ossfuzz \
212    --libfuzzer=$LIB_FUZZING_ENGINE \
213    --optflags=-O1 \
214    --enable-gpl \
215    --disable-muxers \
216    --disable-protocols \
217    --disable-devices \
218    --disable-shared \
219    --disable-encoders \
220    --disable-filters \
221    --disable-muxers  \
222    --disable-parsers  \
223    --disable-decoders  \
224    --disable-hwaccels  \
225    --disable-bsfs  \
226    --disable-vaapi  \
227    --disable-vdpau    \
228    --disable-crystalhd  \
229    --disable-v4l2_m2m  \
230    --disable-cuda_llvm  \
231    --enable-demuxers \
232    --disable-demuxer=rtp,rtsp,sdp \
233
234CONDITIONALS=`grep 'DEMUXER 1$' config.h | sed 's/#define CONFIG_\(.*\)_DEMUXER 1/\1/'`
235if [ -n "${OSS_FUZZ_CI-}" ]; then
236  # When running in CI, check the first targets only to save time and disk space
237  CONDITIONALS=( ${CONDITIONALS[@]:0:2} )
238fi
239for c in $CONDITIONALS ; do
240  fuzzer_name=ffmpeg_dem_${c}_fuzzer
241  symbol=`echo $c | sed "s/.*/\L\0/"`
242  make tools/target_dem_${symbol}_fuzzer
243  mv tools/target_dem_${symbol}_fuzzer $OUT/${fuzzer_name}
244done
245
246# Find relevant corpus in test samples and archive them for every fuzzer.
247#cd $SRC
248#python group_seed_corpus.py $TEST_SAMPLES_PATH $OUT/
249