From 7193f740cad0d6bb35778b419a8656ae8126ddf7 Mon Sep 17 00:00:00 2001 From: "hunter@kvog.sh" Date: Wed, 17 Jun 2026 21:40:13 -0500 Subject: --- .github/workflows/hugo.yml | 29 ++++ .gitignore | 1 + archetypes/default.md | 5 + content/notes/ffmpeg.md | 209 +++++++++++++++++++++++++++ hugo.toml | 7 + themes/kvog/archetypes/default.md | 5 + themes/kvog/assets/css/components/footer.css | 4 + themes/kvog/assets/css/components/header.css | 4 + themes/kvog/assets/css/main.css | 15 ++ themes/kvog/assets/js/main.js | 1 + themes/kvog/content/_index.md | 9 ++ themes/kvog/hugo.toml | 32 ++++ themes/kvog/layouts/_partials/footer.html | 1 + themes/kvog/layouts/_partials/head.html | 5 + themes/kvog/layouts/_partials/head/css.html | 15 ++ themes/kvog/layouts/_partials/head/js.html | 15 ++ themes/kvog/layouts/_partials/header.html | 2 + themes/kvog/layouts/_partials/menu.html | 51 +++++++ themes/kvog/layouts/_partials/terms.html | 23 +++ themes/kvog/layouts/baseof.html | 17 +++ themes/kvog/layouts/home.html | 11 ++ themes/kvog/layouts/page.html | 10 ++ themes/kvog/layouts/section.html | 10 ++ themes/kvog/layouts/taxonomy.html | 7 + themes/kvog/layouts/term.html | 7 + themes/kvog/static/favicon.ico | Bin 0 -> 15406 bytes 26 files changed, 495 insertions(+) create mode 100644 .github/workflows/hugo.yml create mode 100644 .gitignore create mode 100644 archetypes/default.md create mode 100644 content/notes/ffmpeg.md create mode 100644 hugo.toml create mode 100644 themes/kvog/archetypes/default.md create mode 100644 themes/kvog/assets/css/components/footer.css create mode 100644 themes/kvog/assets/css/components/header.css create mode 100644 themes/kvog/assets/css/main.css create mode 100644 themes/kvog/assets/js/main.js create mode 100644 themes/kvog/content/_index.md create mode 100644 themes/kvog/hugo.toml create mode 100644 themes/kvog/layouts/_partials/footer.html create mode 100644 themes/kvog/layouts/_partials/head.html create mode 100644 themes/kvog/layouts/_partials/head/css.html create mode 100644 themes/kvog/layouts/_partials/head/js.html create mode 100644 themes/kvog/layouts/_partials/header.html create mode 100644 themes/kvog/layouts/_partials/menu.html create mode 100644 themes/kvog/layouts/_partials/terms.html create mode 100644 themes/kvog/layouts/baseof.html create mode 100644 themes/kvog/layouts/home.html create mode 100644 themes/kvog/layouts/page.html create mode 100644 themes/kvog/layouts/section.html create mode 100644 themes/kvog/layouts/taxonomy.html create mode 100644 themes/kvog/layouts/term.html create mode 100644 themes/kvog/static/favicon.ico diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml new file mode 100644 index 0000000..e26bd74 --- /dev/null +++ b/.github/workflows/hugo.yml @@ -0,0 +1,29 @@ +name: Deploy Hugo site to Pages + +on: + push: + branches: [master] + +permissions: + contents: write + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: peaceiris/actions-hugo@v3 + with: + hugo-version: 'latest' + extended: true + + - run: hugo --minify + + - uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./public + publish_branch: gh-pages + cname: kvog.sh + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a48cf0d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +public diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..25b6752 --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +date = '{{ .Date }}' +draft = true +title = '{{ replace .File.ContentBaseName "-" " " | title }}' ++++ diff --git a/content/notes/ffmpeg.md b/content/notes/ffmpeg.md new file mode 100644 index 0000000..afc47e4 --- /dev/null +++ b/content/notes/ffmpeg.md @@ -0,0 +1,209 @@ ++++ +date = '2026-06-17T17:50:30-05:00' +title = 'FFmpeg' ++++ + +## Websites + +* [ffmpeg.org](https://ffmpeg.org/) +* [code.ffmpeg.org](https://code.ffmpeg.org/FFmpeg/FFmpeg) - code forge +* [trac.ffmpeg.org](https://trac.ffmpeg.org/query?status=!closed&type=defect&order=id&desc=1) - bug tracker, mostly abandoned in favor of forgejo +* [ffmpeg-devel mailing list](https://lists.ffmpeg.org/mailman3/lists/ffmpeg-devel.ffmpeg.org/) - development mailing list, mostly abandoned in favor of forgejo +* [ffmpeg-devel IRC](https://libera.catirclogs.org/ffmpeg-devel/2026-06) - development chat, very active +* [patchwork.ffmpeg.org](https://patchwork.ffmpeg.org/project/ffmpeg/list/) - archive of patches sent to ffmpeg-devel + +## Documentation + +* Command-line tools, filters, etc: https://ffmpeg.org/ffmpeg-all.html +* Component libraries: https://ffmpeg.org/doxygen/trunk/index.html + +## Building + +List all compile options: +``` +$ ./configure --help | vim - +``` + +Quick development build; takes about 90 seconds on an M1 MacBook Air: +``` +$ ./configure --disable-optimizations --disable-asm +$ make -j $(nproc) +$ make -j $(sysctl -n hw.logicalcpu) +``` + +Troubleshooting build: +``` +$ ./configure --disable-optimizations --assert-level=2 --toolchain=clang-asan +$ ./configure --disable-optimizations --assert-level=2 --toolchain=clang-asan-ubsan +``` + +`--enable-memory-poisoning` makes `av_malloc` and friends basically just do `memset(ptr, 0x2a, size)`. Does not add any asan-style bounds checking. + +## Regression testing + +FATE documentation: https://ffmpeg.org/fate.html, TLDR: +``` +$ ./configure --disable-optimizations --assert-level=2 --toolchain=clang-asan --samples=$HOME/Proj/FFmpeg-FATE +$ make +$ make fate-rsync +$ make fate +``` + +## Benchmarking + +checkasm docs: https://checkasm.videolan.me/ + +Build within FFmpeg: +``` +$ make checkasm +``` + +List tests: +``` +$ ./tests/checkasm/checkasm --list-tests | sort | vim - + +``` + +The easiest way to see what test calls what functions is to check the source code: +
+[`-> tests/checkasm/checkasm.c`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/branch/master/tests/checkasm/checkasm.c). + +Example: +``` +$ ./tests/checkasm/checkasm --bench --test=vf_bwdif +``` +
+Output + +``` +checkasm: + - CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (000906E9) + - Timing source: x86 (rdtsc) + - Bench duration: 1000 µs per function (4003730 cycles) + - Random seed: 2684063072 +C: + - vf_bwdif.bwdif8 [OK] + - vf_bwdif.bwdif10 [OK] + - vf_bwdif.bwdif8.line3 [OK] + - vf_bwdif.bwdif8.edge [OK] + - vf_bwdif.bwdif8.intra [OK] +SSE2: + - vf_bwdif.bwdif8 [OK] + - vf_bwdif.bwdif10 [OK] +SSSE3: + - vf_bwdif.bwdif8 [OK] + - vf_bwdif.bwdif10 [OK] +AVX2: + - vf_bwdif.bwdif8 [OK] + - vf_bwdif.bwdif10 [OK] +checkasm: all 6 tests passed +Benchmark results: + name cycles (vs ref) + bwdif8_c: 28876.2 + bwdif8_sse2: 1056.1 (25.12x) + bwdif8_ssse3: 870.5 (22.92x) + bwdif8_avx2: 550.6 (40.40x) + bwdif8.edge.s0.p0_c: 1373.2 + bwdif8.edge.s0.p1_c: 1310.2 + bwdif8.edge.s1.p0_c: 5368.5 + bwdif8.edge.s1.p1_c: 5824.8 + bwdif8.intra_c: 584.1 + bwdif8.line3.rnd.p0_c: 40020.9 + bwdif8.line3.rnd.p1_c: 30286.6 + bwdif10_c: 27988.9 + bwdif10_sse2: 935.6 (27.51x) + bwdif10_ssse3: 864.2 (27.04x) + bwdif10_avx2: 594.3 (36.53x) +``` + +
+ +## libavformat architecture + +Note: This is all based off of FFmpeg 8.1.2 (commit `38b88335f99e76ed89ff3c93f877fdefce736c13`) + +Stepping through [`doc/examples/remux.c`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/doc/examples/remux.c): + + + +
+ +[`doc/examples/remux.c:75`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/doc/examples/remux.c#L75): +`main` calls `avformat_open_input`. + + +
+ +[`libavformat/demux.c:241`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/demux.c#L241): +`avformat_open_input` calls `avformat_alloc_context` to allocate memory. + +[`libavformat/demux.c:266`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/demux.c#L266): +`avformat_open_input` calls `init_input`. + +
+ +[`libavformat/demux.c:185`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/demux.c#L185): +`init_input` calls `av_probe_input_buffer2`, which reads the first 2048 bytes of the input file +and passes it to `av_probe_input_format2`, which calls `avprobe_input_format3`. + +
+ +[`libavformat/format.c:175`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/format.c#L175): +`av_probe_input_format3` attemptes to locate id3 tags within the buffer + +[`libavformat/format.c:191`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/format.c#L191): +`av_probe_input_format3` iterates over each registered `FFInputFormat`, and calls the `probe` +function pointer, if present. `probe` takes the buffer and returns a score that represents how +likely the data matches that format. Some other factors are taken into account, such as the +extension of the file and what id3 tags were found. + +The most likely `AVInputFormat *` (composite class in `FFInputFormat`) is returned if found, +otherwise `NULL`. + +
+ +[`libavformat/demux.c:305`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/demux.c#L305): +`init_input` allocates any private data required by the `FFInputFormat`. + +[`libavformat/demux.c:322`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/demux.c#L322): +`init_input` calls the `read_header` function pointer, if present. + +
+ +`read_header` will typically call `avformat_new_stream` to allocate streams. + +
+ +[`libavformat/demux.c:355`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/demux.c#L355): +`init_input` calls the `update_stream_avctx`, which updates contexts for each stream. I am not sure +why this is needed since no codecs should be open at this point, only demuxing. + +
+ +[`libavformat/demux.c:194`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/libavformat/demux.c#L194): +`update_stream_avctx` iterates over each detected stream and calls `avcodec_parameters_to_context` +if `FFStream->need_context_update == 1`. + +
+
+ +To summarize, `avformat_open_input` probes the file to detect the container, initializes the +demuxer instance, and reads the file header. + +
+ +[`doc/examples/remux.c:80`](https://code.ffmpeg.org/FFmpeg/FFmpeg/src/commit/38b88335f99e76ed89ff3c93f877fdefce736c13/doc/examples/remux.c#L80): +`main` calls `avformat_find_stream_info`. + +
diff --git a/hugo.toml b/hugo.toml new file mode 100644 index 0000000..fe72115 --- /dev/null +++ b/hugo.toml @@ -0,0 +1,7 @@ +baseURL = 'https://kvog.sh/' +locale = 'en-us' +title = 'kvog.sh' +theme = 'kvog' + +[markup.goldmark.renderer] + unsafe = true diff --git a/themes/kvog/archetypes/default.md b/themes/kvog/archetypes/default.md new file mode 100644 index 0000000..25b6752 --- /dev/null +++ b/themes/kvog/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +date = '{{ .Date }}' +draft = true +title = '{{ replace .File.ContentBaseName "-" " " | title }}' ++++ diff --git a/themes/kvog/assets/css/components/footer.css b/themes/kvog/assets/css/components/footer.css new file mode 100644 index 0000000..abe2b5a --- /dev/null +++ b/themes/kvog/assets/css/components/footer.css @@ -0,0 +1,4 @@ +footer { + border-top: 1px solid #222; + margin-top: 1rem; +} diff --git a/themes/kvog/assets/css/components/header.css b/themes/kvog/assets/css/components/header.css new file mode 100644 index 0000000..8efea1e --- /dev/null +++ b/themes/kvog/assets/css/components/header.css @@ -0,0 +1,4 @@ +header { + border-bottom: 1px solid #222; + margin-bottom: 1rem; +} diff --git a/themes/kvog/assets/css/main.css b/themes/kvog/assets/css/main.css new file mode 100644 index 0000000..11744b1 --- /dev/null +++ b/themes/kvog/assets/css/main.css @@ -0,0 +1,15 @@ +@import "components/header.css"; +@import "components/footer.css"; + +body { + color: #222; + font-family: sans-serif; + line-height: 1.5; + margin: 1rem; + max-width: 1024px; +} + +a { + color: #00e; + text-decoration: none; +} diff --git a/themes/kvog/assets/js/main.js b/themes/kvog/assets/js/main.js new file mode 100644 index 0000000..e2aac52 --- /dev/null +++ b/themes/kvog/assets/js/main.js @@ -0,0 +1 @@ +console.log('This site was generated by Hugo.'); diff --git a/themes/kvog/content/_index.md b/themes/kvog/content/_index.md new file mode 100644 index 0000000..a3b8328 --- /dev/null +++ b/themes/kvog/content/_index.md @@ -0,0 +1,9 @@ ++++ +title = 'Home' +date = 2023-01-01T08:00:00-07:00 +draft = false ++++ + +This website is very messed up at the moment. Sorry. + +🦍 diff --git a/themes/kvog/hugo.toml b/themes/kvog/hugo.toml new file mode 100644 index 0000000..a84662e --- /dev/null +++ b/themes/kvog/hugo.toml @@ -0,0 +1,32 @@ +baseURL = 'https://example.org/' +locale = 'en-US' +title = 'My New Hugo Project' + +[menus] + [[menus.main]] + name = 'Home' + pageRef = '/' + weight = 10 + +# [[menus.main]] +# name = 'Posts' +# pageRef = '/posts' +# weight = 20 + +# [[menus.main]] +# name = 'Notes' +# pageRef = '/notes' +# weight = 30 + +# [[menus.main]] +# name = 'Tags' +# pageRef = '/tags' +# weight = 40 + +[module] + [module.hugoVersion] + extended = false + min = '0.146.0' + +[markup.goldmark.renderer] + unsafe = true diff --git a/themes/kvog/layouts/_partials/footer.html b/themes/kvog/layouts/_partials/footer.html new file mode 100644 index 0000000..a7cd916 --- /dev/null +++ b/themes/kvog/layouts/_partials/footer.html @@ -0,0 +1 @@ +

Copyright {{ now.Year }}. All rights reserved.

diff --git a/themes/kvog/layouts/_partials/head.html b/themes/kvog/layouts/_partials/head.html new file mode 100644 index 0000000..02c2240 --- /dev/null +++ b/themes/kvog/layouts/_partials/head.html @@ -0,0 +1,5 @@ + + +{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title site.Title }}{{ end }} +{{ partialCached "head/css.html" . }} +{{ partialCached "head/js.html" . }} diff --git a/themes/kvog/layouts/_partials/head/css.html b/themes/kvog/layouts/_partials/head/css.html new file mode 100644 index 0000000..8897866 --- /dev/null +++ b/themes/kvog/layouts/_partials/head/css.html @@ -0,0 +1,15 @@ +{{- with resources.Get "css/main.css" }} + {{- $opts := dict + "minify" (cond hugo.IsDevelopment false true) + "sourceMap" (cond hugo.IsDevelopment "linked" "none") + }} + {{- with . | css.Build $opts }} + {{- if hugo.IsDevelopment }} + + {{- else }} + {{- with . | fingerprint }} + + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/themes/kvog/layouts/_partials/head/js.html b/themes/kvog/layouts/_partials/head/js.html new file mode 100644 index 0000000..0210efa --- /dev/null +++ b/themes/kvog/layouts/_partials/head/js.html @@ -0,0 +1,15 @@ +{{- with resources.Get "js/main.js" }} + {{- $opts := dict + "minify" (cond hugo.IsDevelopment false true) + "sourceMap" (cond hugo.IsDevelopment "linked" "none") + }} + {{- with . | js.Build $opts }} + {{- if hugo.IsDevelopment }} + + {{- else }} + {{- with . | fingerprint }} + + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/themes/kvog/layouts/_partials/header.html b/themes/kvog/layouts/_partials/header.html new file mode 100644 index 0000000..7980a00 --- /dev/null +++ b/themes/kvog/layouts/_partials/header.html @@ -0,0 +1,2 @@ +

{{ site.Title }}

+{{ partial "menu.html" (dict "menuID" "main" "page" .) }} diff --git a/themes/kvog/layouts/_partials/menu.html b/themes/kvog/layouts/_partials/menu.html new file mode 100644 index 0000000..14245b5 --- /dev/null +++ b/themes/kvog/layouts/_partials/menu.html @@ -0,0 +1,51 @@ +{{- /* +Renders a menu for the given menu ID. + +@context {page} page The current page. +@context {string} menuID The menu ID. + +@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }} +*/}} + +{{- $page := .page }} +{{- $menuID := .menuID }} + +{{- with index site.Menus $menuID }} + +{{- end }} + +{{- define "_partials/inline/menu/walk.html" }} + {{- $page := .page }} + {{- range .menuEntries }} + {{- $attrs := dict "href" .URL }} + {{- if $page.IsMenuCurrent .Menu . }} + {{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }} + {{- else if $page.HasMenuCurrent .Menu .}} + {{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }} + {{- end }} + {{- $name := .Name }} + {{- with .Identifier }} + {{- with T . }} + {{- $name = . }} + {{- end }} + {{- end }} +
  • + {{ $name }} + {{- with .Children }} + + {{- end }} +
  • + {{- end }} +{{- end }} diff --git a/themes/kvog/layouts/_partials/terms.html b/themes/kvog/layouts/_partials/terms.html new file mode 100644 index 0000000..8a6ebec --- /dev/null +++ b/themes/kvog/layouts/_partials/terms.html @@ -0,0 +1,23 @@ +{{- /* +For a given taxonomy, renders a list of terms assigned to the page. + +@context {page} page The current page. +@context {string} taxonomy The taxonomy. + +@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }} +*/}} + +{{- $page := .page }} +{{- $taxonomy := .taxonomy }} + +{{- with $page.GetTerms $taxonomy }} + {{- $label := (index . 0).Parent.LinkTitle }} +
    +
    {{ $label }}:
    + +
    +{{- end }} diff --git a/themes/kvog/layouts/baseof.html b/themes/kvog/layouts/baseof.html new file mode 100644 index 0000000..7d17aa5 --- /dev/null +++ b/themes/kvog/layouts/baseof.html @@ -0,0 +1,17 @@ + + + + {{ partial "head.html" . }} + + +
    + {{ partial "header.html" . }} +
    +
    + {{ block "main" . }}{{ end }} +
    + + + diff --git a/themes/kvog/layouts/home.html b/themes/kvog/layouts/home.html new file mode 100644 index 0000000..6d91f58 --- /dev/null +++ b/themes/kvog/layouts/home.html @@ -0,0 +1,11 @@ +{{ define "main" }} + {{ .Content }} + +{{ end }} diff --git a/themes/kvog/layouts/page.html b/themes/kvog/layouts/page.html new file mode 100644 index 0000000..7e286c8 --- /dev/null +++ b/themes/kvog/layouts/page.html @@ -0,0 +1,10 @@ +{{ define "main" }} +

    {{ .Title }}

    + + {{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }} + {{ $dateHuman := .Date | time.Format ":date_long" }} + + + {{ .Content }} + {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }} +{{ end }} diff --git a/themes/kvog/layouts/section.html b/themes/kvog/layouts/section.html new file mode 100644 index 0000000..748f2f5 --- /dev/null +++ b/themes/kvog/layouts/section.html @@ -0,0 +1,10 @@ +{{ define "main" }} +

    {{ .Title }}

    + {{ .Content }} + {{ range .Pages }} +
    +

    {{ .LinkTitle }}

    + {{ .Summary }} +
    + {{ end }} +{{ end }} diff --git a/themes/kvog/layouts/taxonomy.html b/themes/kvog/layouts/taxonomy.html new file mode 100644 index 0000000..c2e7875 --- /dev/null +++ b/themes/kvog/layouts/taxonomy.html @@ -0,0 +1,7 @@ +{{ define "main" }} +

    {{ .Title }}

    + {{ .Content }} + {{ range .Pages }} +

    {{ .LinkTitle }}

    + {{ end }} +{{ end }} diff --git a/themes/kvog/layouts/term.html b/themes/kvog/layouts/term.html new file mode 100644 index 0000000..c2e7875 --- /dev/null +++ b/themes/kvog/layouts/term.html @@ -0,0 +1,7 @@ +{{ define "main" }} +

    {{ .Title }}

    + {{ .Content }} + {{ range .Pages }} +

    {{ .LinkTitle }}

    + {{ end }} +{{ end }} diff --git a/themes/kvog/static/favicon.ico b/themes/kvog/static/favicon.ico new file mode 100644 index 0000000..67f8b77 Binary files /dev/null and b/themes/kvog/static/favicon.ico differ -- cgit v1.2.3