# WebCodecs Test Files

[TOC]

## Instructions

To add, update or remove a test file, please update the list below.

Please provide full reference and steps to generate the test file so that
anybody can regenerate or update the file in the future.

## Notes
* When updating the sample offsets and descriptions for tests using mp4 files, it's easiest to use [mp4box.js](https://gpac.github.io/mp4box.js/test/filereader.html).
  * Sample offsets can be copied from the "Sample View" tab after unchecking all but offset and size. Use a multi-line edit mode and clang-format to quickly format entries.
  * Description entries can be found under moov.trak.mdia.minf.stbl.stsd in box view.
    * avc1.avcC or hvc1.hvcC has an offset, size in the same view. Add 8 to offset and subtract 8 from the size to get the values the tests want.
  * If you use ffprobe -show_packets to get sample offsets, you may need to add 4 to each `pos` value. You can tell if you need to by whether or not tests pass.

## List of Test Files

### four-colors.png
Generated using MSPaint like a true professional.

### four-colors.avif
Lossless encoding must be used to ensure colors are perfect.
```
avifenc -l four-colors.png -o four-colors.avif
```

### four-colors.webp
Lossless encoding must be used to ensure colors are perfect.
```
ffmpeg -i four-colors.png -lossless 1 -y four-colors.webp
```

### four-colors-limited-range-420-8bpc.webp
```
ffmpeg -i four-colors.png -pix_fmt yuv420p four-colors-limited-range-420-8bpc.webp
```

### four-colors.gif
High quality encoding must be used to ensure colors are perfect.
```
cp four-colors.png four-colors2.png
gifski -o four-colors.gif four-colors*.png
```

### four-colors-flip.gif
High quality encoding must be used to ensure colors are perfect.
```
ffmpeg -i four-colors.png -vf "rotate=PI" four-colors2.png
gifski -o four-colors-flip.gif four-colors*.png
```

### four-colors-flip.avif
```
ffmpeg -i four-colors-flip.gif -crf 16 four-colors-flip.avif
```

### four-colors-limited-range-(420|422|444)-8bpc.avif
```
avifenc -r l -d 8 -y 420 -s 0 four-colors.png four-colors-limited-range-420-8bpc.avif
avifenc -r l -d 8 -y 422 -s 0 four-colors.png four-colors-limited-range-422-8bpc.avif
avifenc -r l -d 8 -y 444 -s 0 four-colors.png four-colors-limited-range-444-8bpc.avif
```

### four-colors-full-range-bt2020-pq-444-10bpc.avif
```
avifenc -r f -d 10 -y 444 -s 0 --nclx 9/16/9 four-colors.png four-colors-full-range-bt2020-pq-444-10bpc.avif
```

### four-colors.jpg
Used [Sqoosh.app](https://squoosh.app/) with MozJPEG compression and RGB
channels. exiftool was then used to add an orientation marker.
```
exiftool -Orientation=1 -n four-colors.jpg
```

### four-colors-limited-range-420-8bpc.jpg
Used [Sqoosh.app](https://squoosh.app/) with MozJPEG compression and YUV
channels. exiftool was then used to add an orientation marker.
```
exiftool -Orientation=1 -n four-colors-limited-range-420-8bpc.jpg
```

### four-colors.mp4
Used a [custom tool](https://storage.googleapis.com/dalecurtis/avif2mp4.html) to convert four-colors.avif into a .mp4 file.

### h264.mp4
```
ffmpeg -f lavfi -i testsrc=rate=10:n=1 -t 1 -pix_fmt yuv420p -vcodec h264 -tune zerolatency h264.mp4
```

### h264.annexb
```
ffmpeg -i h264.mp4 -codec copy -bsf:v h264_mp4toannexb -f h264 h264.annexb
```

### h265.mp4
```
ffmpeg -f lavfi -i testsrc=rate=10:n=1 -t 1 -pix_fmt yuv420p -vcodec hevc -tag:v hvc1 -tune zerolatency h265.mp4
```

### h265.annexb
```
ffmpeg -i h265.mp4 -codec copy -bsf:v hevc_mp4toannexb -f hevc h265.annexb
```

### sfx.adts
```
sox -n -r 48000 sfx.wav synth 1 sine 480
ffmpeg -i sfx.wav -frames:a 10 -acodec aac -b:a 96K sfx.adts
```

### sfx.mp3
```
sox -n -r 48000 sfx.wav synth 1 sine 480
ffmpeg -i sfx.wav -frames:a 10 -acodec libmp3lame -b:a 96K sfx.mp3
```

### sfx.flac
```
sox -n -r 48000 sfx.wav synth 1 sine 480
ffmpeg -i sfx.wav -frames:a 10 sfx.flac
```

### sfx-aac.mp4
```
sox -n -r 48000 sfx.wav synth 1 sine 480
ffmpeg -i sfx.wav -frames:a 10 -acodec aac -b:a 96K sfx-aac.mp4
```

### sfx-*.wav
```
sox -n -r 48000 sfx.wav synth 1 sine 480
for codec in s16 s24 s32 f32
do
  # Add "le" suffix
  ffmpeg -i sfx.wav -frames:a 10 -acodec pcm_"$codec"le sfx-pcm-$codec.wav
done
ffmpeg -i sfx.wav -frames:a 10 -acodec pcm_u8 sfx-pcm-u8.wav
for codec in alaw mulaw
do
  ffmpeg -i sfx.wav -frames:a 10 -acodec pcm_$codec sfx-$codec.wav
done
```

### sfx-opus.ogg
```
sox -n -r 48000 sfx.wav synth 1 sine 480
ffmpeg -i sfx.wav -frames:a 10 -acodec libopus -b:a 96K sfx-opus.ogg

### sfx-vorbis.ogg
```
sox -n -r 48000 sfx.wav synth 1 sine 480
ffmpeg -i sfx.wav -frames:a 10 -acodec libvorbis -b:a 96K sfx-vorbis.ogg
```

### av1.mp4
```
ffmpeg -f lavfi -i testsrc=rate=10:n=1 -t 1 -pix_fmt yuv420p -vcodec libaom-av1 av1.mp4
```

### vp8.webm
```
ffmpeg -f lavfi -i testsrc=rate=10:n=1 -t 1 -pix_fmt yuv420p -vcodec vp8 vp8.webm
```

### vp9.mp4
```
ffmpeg -f lavfi -i testsrc=rate=10:n=1 -t 1 -pix_fmt yuv420p -vcodec vp9 vp9.mp4
```
