ranger-compiler 3.5.0 → 3.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1160 -19
- package/LICENSE +3 -1
- package/README.md +124 -29
- package/dist/Lang.rgr +1188 -290
- package/dist/api.d.ts +2343 -879
- package/dist/api.js +79924 -56922
- package/dist/lib/JSON.rgr +102 -91
- package/dist/lib/Shell.rgr +4 -4
- package/dist/lib/apple/AppleToolchain.rgr +4 -4
- package/dist/lib/apple/README.md +5 -4
- package/dist/lib/apple/apple_test.rgr +1 -1
- package/dist/lib/core/README.md +1 -1
- package/dist/lib/evg/EVG.rgr +12 -0
- package/dist/lib/evg/EVGA11yFromTree.rgr +302 -0
- package/dist/lib/evg/EVGA11yTree.rgr +894 -0
- package/dist/lib/evg/EVGBox.rgr +267 -0
- package/dist/lib/evg/EVGBoxShorthandTest.rgr +220 -0
- package/dist/lib/evg/EVGCodepoint.rgr +316 -0
- package/dist/lib/evg/EVGColor.rgr +700 -0
- package/dist/lib/evg/EVGCommands.rgr +177 -0
- package/dist/lib/evg/EVGComponent.rgr +331 -0
- package/dist/lib/evg/EVGComponentTest.rgr +387 -0
- package/dist/lib/evg/EVGConnector.rgr +541 -0
- package/dist/lib/evg/EVGConnectorTest.rgr +306 -0
- package/dist/lib/evg/EVGDisplayList.rgr +4186 -0
- package/dist/lib/evg/EVGEasing.rgr +370 -0
- package/dist/lib/evg/EVGEffectTest.rgr +253 -0
- package/dist/lib/evg/EVGElement.rgr +4914 -0
- package/dist/lib/evg/EVGFixedTest.rgr +289 -0
- package/dist/lib/evg/EVGFlexRulesTest.rgr +317 -0
- package/dist/lib/evg/EVGFlexWrapTest.rgr +246 -0
- package/dist/lib/evg/EVGFling.rgr +244 -0
- package/dist/lib/evg/EVGFocus.rgr +400 -0
- package/dist/lib/evg/EVGFocusTest.rgr +399 -0
- package/dist/lib/evg/EVGGradient.rgr +322 -0
- package/dist/lib/evg/EVGGrapheme.rgr +190 -0
- package/dist/lib/evg/EVGGrid.rgr +975 -0
- package/dist/lib/evg/EVGHitTest.rgr +208 -0
- package/dist/lib/evg/EVGHoles.rgr +294 -0
- package/dist/lib/evg/EVGHostMeasurerTest.rgr +281 -0
- package/dist/lib/evg/EVGHostTextMeasurer.rgr +331 -0
- package/dist/lib/evg/EVGHostTree.rgr +834 -0
- package/dist/lib/evg/EVGHostTreeTest.rgr +447 -0
- package/dist/lib/evg/EVGImageDecode.rgr +117 -0
- package/dist/lib/evg/EVGImageMeasurer.rgr +86 -0
- package/dist/lib/evg/EVGInspect.rgr +883 -0
- package/dist/lib/evg/EVGInvalidateTest.rgr +432 -0
- package/dist/lib/evg/EVGJsonTest.rgr +535 -0
- package/dist/lib/evg/EVGLayout.rgr +4220 -0
- package/dist/lib/evg/EVGMeasure.rgr +1267 -0
- package/dist/lib/evg/EVGOverlayTest.rgr +626 -0
- package/dist/lib/evg/EVGPatch.rgr +1721 -0
- package/dist/lib/evg/EVGPatchTest.rgr +692 -0
- package/dist/lib/evg/EVGPopoverTest.rgr +395 -0
- package/dist/lib/evg/EVGReconcile.rgr +226 -0
- package/dist/lib/evg/EVGReconcileTest.rgr +421 -0
- package/dist/lib/evg/EVGReject.rgr +126 -0
- package/dist/lib/evg/EVGRelayoutTest.rgr +375 -0
- package/dist/lib/evg/EVGRtlLayoutTest.rgr +319 -0
- package/dist/lib/evg/EVGRuler.rgr +232 -0
- package/dist/lib/evg/EVGRulerTest.rgr +172 -0
- package/dist/lib/evg/EVGSelectChrome.rgr +178 -0
- package/dist/lib/evg/EVGStyleCacheTest.rgr +419 -0
- package/dist/lib/evg/EVGStyleSheet.rgr +2148 -0
- package/dist/lib/evg/EVGStyleStateTest.rgr +407 -0
- package/dist/lib/evg/EVGStyleVarTest.rgr +471 -0
- package/dist/lib/evg/EVGText.rgr +105 -0
- package/dist/lib/evg/EVGTextEngine.rgr +536 -0
- package/dist/lib/evg/EVGTextMeasurer.rgr +720 -0
- package/dist/lib/evg/EVGTimingTest.rgr +1417 -0
- package/dist/lib/evg/EVGToolbar.rgr +1369 -0
- package/dist/lib/evg/EVGTransition.rgr +728 -0
- package/dist/lib/evg/EVGTreeJson.rgr +721 -0
- package/dist/lib/evg/EVGUnit.rgr +554 -0
- package/dist/lib/evg/EVGViewportUnitTest.rgr +236 -0
- package/dist/lib/evg/EvgApp.rgr +189 -0
- package/dist/lib/evg/EvgBitmapTracer.rgr +4277 -0
- package/dist/lib/evg/EvgBitmapTracerTest.rgr +2119 -0
- package/dist/lib/evg/EvgHost.rgr +451 -0
- package/dist/lib/evg/EvgTest.rgr +91 -0
- package/dist/lib/evg/EvgTraceColor.rgr +236 -0
- package/dist/lib/evg/EvgTraceCurve.rgr +648 -0
- package/dist/lib/evg/EvgTraceFit.rgr +767 -0
- package/dist/lib/evg/EvgTracePath.rgr +435 -0
- package/dist/lib/evg/EvgTraceTypes.rgr +559 -0
- package/dist/lib/evg/EvgViewport.rgr +313 -0
- package/dist/lib/evg/FxDemoDoc.rgr +185 -0
- package/dist/lib/evg/HOSTS.md +227 -0
- package/dist/lib/evg/ISSUES.md +835 -0
- package/dist/lib/evg/PLAN_ACCESSIBILITY.md +650 -0
- package/dist/lib/evg/PLAN_CSS_LAYOUT_AND_FONTS.md +1124 -0
- package/dist/lib/evg/PLAN_EFFECTS.md +431 -0
- package/dist/lib/evg/PLAN_EVG.md +518 -0
- package/dist/lib/evg/PLAN_EVG_RENDERER.md +1674 -0
- package/dist/lib/evg/PLAN_INSPECTOR.md +788 -0
- package/dist/lib/evg/PLAN_LINKS_AND_FORMS.md +157 -0
- package/dist/lib/evg/PLAN_NATIVE_HOSTS.md +671 -0
- package/dist/lib/evg/PLAN_VECTOR_IR.md +664 -0
- package/dist/lib/evg/PLAN_VIEW_TRANSFORM.md +322 -0
- package/dist/lib/evg/PathBuilder.rgr +333 -0
- package/dist/lib/evg/README.md +1236 -0
- package/dist/lib/evg/SPEC.md +1252 -0
- package/dist/lib/evg/SVGPathParser.rgr +1199 -0
- package/dist/lib/evg/SvgParser.rgr +1736 -0
- package/dist/lib/evg/TODO_EVG_RENDERER.md +595 -0
- package/dist/lib/evg/VectorShapes.rgr +331 -0
- package/dist/lib/evg/VectorStroke.rgr +107 -0
- package/dist/lib/evg/VectorViewBox.rgr +380 -0
- package/dist/lib/evg/agent/README.md +290 -0
- package/dist/lib/evg/agent/evg_agent.rgr +899 -0
- package/dist/lib/evg/agent/fixtures/broken.evg.json +7 -0
- package/dist/lib/evg/agent/fixtures/card.evg.json +9 -0
- package/dist/lib/evg/agent/fixtures/connector.css +63 -0
- package/dist/lib/evg/agent/fixtures/connector.evg.json +14 -0
- package/dist/lib/evg/agent/fixtures/drawn.evg.json +129 -0
- package/dist/lib/evg/agent/fixtures/gradient.evg.json +4 -0
- package/dist/lib/evg/agent/fixtures/popover.css +99 -0
- package/dist/lib/evg/agent/fixtures/popover.evg.json +30 -0
- package/dist/lib/evg/agent/roundtrip.sh +74 -0
- package/dist/lib/evg/agent/smoke.sh +230 -0
- package/dist/lib/evg/android/README.md +97 -0
- package/dist/lib/evg/android/androidstubs/AndroidStubs.kt +175 -0
- package/dist/lib/evg/android/androidstubs/Annotation.kt +10 -0
- package/dist/lib/evg/android/androidstubs/App.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Content.kt +41 -0
- package/dist/lib/evg/android/androidstubs/ContentRes.kt +12 -0
- package/dist/lib/evg/android/androidstubs/InputMethod.kt +46 -0
- package/dist/lib/evg/android/androidstubs/Net.kt +6 -0
- package/dist/lib/evg/android/androidstubs/Os.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Util.kt +15 -0
- package/dist/lib/evg/android/androidstubs/View.kt +113 -0
- package/dist/lib/evg/android/androidstubs/Widget.kt +16 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidEvgSurface.kt +323 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidTextMeasurer.kt +56 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/RippleEffect.kt +262 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtEvgSurface.kt +238 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtTextMeasurer.kt +85 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgEngineThread.kt +115 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgPainter.kt +231 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgSurface.kt +117 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/RecordingSurface.kt +94 -0
- package/dist/lib/evg/apple/README.md +128 -0
- package/dist/lib/evg/apple/Sources/CoreGraphicsEvgSurface.swift +329 -0
- package/dist/lib/evg/apple/Sources/CoreTextMeasurer.swift +70 -0
- package/dist/lib/evg/apple/Sources/EvgEngineQueue.swift +105 -0
- package/dist/lib/evg/apple/Sources/EvgPainter.swift +225 -0
- package/dist/lib/evg/apple/Sources/EvgSurface.swift +163 -0
- package/dist/lib/evg/apple/Sources/RecordingSurface.swift +110 -0
- package/dist/lib/evg/bench/EvgLayoutBench.rgr +34 -0
- package/dist/lib/evg/bench/README.md +64 -0
- package/dist/lib/evg/bench/layout-bench.mjs +316 -0
- package/dist/lib/evg/bench/layout-cases.mjs +510 -0
- package/dist/lib/evg/bench/layout-conformance.mjs +254 -0
- package/dist/lib/evg/bin/.gitignore +17 -0
- package/dist/lib/evg/evg_test.rgr +313 -0
- package/dist/lib/evg/gl/README.md +198 -0
- package/dist/lib/evg/gl/a11y-paint-check.mjs +73 -0
- package/dist/lib/evg/gl/blur-check.mjs +399 -0
- package/dist/lib/evg/gl/boxmodel.json +1 -0
- package/dist/lib/evg/gl/demo.html +46 -0
- package/dist/lib/evg/gl/effect-presets.css +285 -0
- package/dist/lib/evg/gl/effect-presets.js +63 -0
- package/dist/lib/evg/gl/effect-shots.mjs +135 -0
- package/dist/lib/evg/gl/evg-a11y.js +566 -0
- package/dist/lib/evg/gl/evg-binary.js +160 -0
- package/dist/lib/evg/gl/evg-engine.js +296 -0
- package/dist/lib/evg/gl/evg-fx.js +237 -0
- package/dist/lib/evg/gl/evg-gestures.js +209 -0
- package/dist/lib/evg/gl/evg-list.js +167 -0
- package/dist/lib/evg/gl/evg-measure.js +186 -0
- package/dist/lib/evg/gl/evg-textinput.js +303 -0
- package/dist/lib/evg/gl/evg-view.js +144 -0
- package/dist/lib/evg/gl/evg-webgl.js +3942 -0
- package/dist/lib/evg/gl/fx-check.mjs +998 -0
- package/dist/lib/evg/gl/fx-demo.html +166 -0
- package/dist/lib/evg/gl/fx-demo.js +2 -0
- package/dist/lib/evg/gl/fx-serve.mjs +47 -0
- package/dist/lib/evg/gl/gestures-check.mjs +189 -0
- package/dist/lib/evg/gl/list-binary-check.mjs +152 -0
- package/dist/lib/evg/gl/measure-check.mjs +135 -0
- package/dist/lib/evg/gl/rotation-check.mjs +207 -0
- package/dist/lib/evg/gl/shift-check.mjs +113 -0
- package/dist/lib/evg/gl/stroke-check.mjs +168 -0
- package/dist/lib/evg/gl/text-snap-check.mjs +139 -0
- package/dist/lib/evg/gl/view-check.mjs +343 -0
- package/dist/lib/evg/gl/view-policy-check.mjs +184 -0
- package/dist/lib/evg/html/evg-dom.js +318 -0
- package/dist/lib/evg/html/evg-html.js +600 -0
- package/dist/lib/evg/inspect/README.md +415 -0
- package/dist/lib/evg/inspect/browser-smoke.mjs +115 -0
- package/dist/lib/evg/inspect/evg-inspect.js +947 -0
- package/dist/lib/evg/inspect/shots/css.png +0 -0
- package/dist/lib/evg/inspect/shots/dashboard.png +0 -0
- package/dist/lib/evg/inspect/shots/pptx-slide.png +0 -0
- package/dist/lib/evg/inspect/shots/state.png +0 -0
- package/dist/lib/evg/inspect/shots.mjs +226 -0
- package/dist/lib/evg/oracle/css-blur.json +576 -0
- package/dist/lib/evg/oracle/css-box.json +157 -0
- package/dist/lib/evg/oracle/css-timing.json +709 -0
- package/dist/lib/evg/oracle/css_blur_oracle.mjs +529 -0
- package/dist/lib/evg/oracle/css_box_oracle.mjs +106 -0
- package/dist/lib/evg/oracle/css_timing_oracle.mjs +389 -0
- package/dist/lib/evg/original/EVGColor.clj +310 -0
- package/dist/lib/evg/original/EVGColorContext.rgr +178 -0
- package/dist/lib/evg/original/SVGPath.rgr +627 -0
- package/dist/lib/evg/original/Vec2.crgr +103 -0
- package/dist/lib/evg/ranger.json +9 -0
- package/dist/lib/evg/showcase/README.md +246 -0
- package/dist/lib/evg/showcase/assets/emblem.svg +30 -0
- package/dist/lib/evg/showcase/assets/rosette.svg +22 -0
- package/dist/lib/evg/showcase/build.mjs +651 -0
- package/dist/lib/evg/showcase/pages/album.tsx +30 -0
- package/dist/lib/evg/showcase/pages/boxmodel.tsx +37 -0
- package/dist/lib/evg/showcase/pages/cards.tsx +41 -0
- package/dist/lib/evg/showcase/pages/chart_api.tsx +170 -0
- package/dist/lib/evg/showcase/pages/charts.tsx +219 -0
- package/dist/lib/evg/showcase/pages/drawing.tsx +160 -0
- package/dist/lib/evg/showcase/pages/emoji.tsx +91 -0
- package/dist/lib/evg/showcase/pages/flex.tsx +46 -0
- package/dist/lib/evg/showcase/pages/more.tsx +332 -0
- package/dist/lib/evg/showcase/pages/plots.tsx +262 -0
- package/dist/lib/evg/showcase/pages/svg.tsx +63 -0
- package/dist/lib/evg/showcase/pages/tables.tsx +209 -0
- package/dist/lib/evg/showcase/pages/typography.tsx +43 -0
- package/dist/lib/evg/showcase/pages/units.tsx +35 -0
- package/dist/lib/evg/showcase/pages/variants.tsx +233 -0
- package/dist/lib/evg/showcase/pages/vector.tsx +75 -0
- package/dist/lib/evg/showcase/pages/views.tsx +223 -0
- package/dist/lib/evg/showcase/tests/chart_api_smoke.mjs +339 -0
- package/dist/lib/evg/showcase/tests/gl_smoke.mjs +125 -0
- package/dist/lib/evg/showcase/themes/chart_api-default.css +15 -0
- package/dist/lib/evg/showcase/themes/charts-default.css +29 -0
- package/dist/lib/evg/showcase/themes/drawing-default.css +35 -0
- package/dist/lib/evg/showcase/themes/more-default.css +128 -0
- package/dist/lib/evg/showcase/themes/plots-default.css +18 -0
- package/dist/lib/evg/showcase/themes/showcase.css +508 -0
- package/dist/lib/evg/showcase/themes/tables-default.css +123 -0
- package/dist/lib/evg/showcase/themes/variants-default.css +15 -0
- package/dist/lib/evg/showcase/themes/views-default.css +15 -0
- package/dist/lib/evg/tools/bench_vs_potrace.mjs +290 -0
- package/dist/lib/evg/tools/evg_image_tool.rgr +488 -0
- package/dist/lib/evg/tools/evg_trace_bench.rgr +114 -0
- package/dist/lib/evg/tools/evg_trace_cli.rgr +662 -0
- package/dist/lib/evg/tools/evg_trace_cpp_bench.rgr +83 -0
- package/dist/lib/evg/tools/run_trace_bench.sh +74 -0
- package/dist/lib/evg/tools/run_trace_cli_smoke.sh +128 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveCheck.rgr +271 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveDemo.rgr +531 -0
- package/dist/lib/evg/web/responsive/README.md +97 -0
- package/dist/lib/evg/web/responsive/build.mjs +90 -0
- package/dist/lib/evg/web/responsive/dom-check.mjs +169 -0
- package/dist/lib/evg/web/responsive/index.html +177 -0
- package/dist/lib/evg/web/responsive/smoke.mjs +221 -0
- package/dist/lib/evg/web/tools/assets-client.mjs +95 -0
- package/dist/lib/evg/web/tools/boot-bench.mjs +189 -0
- package/dist/lib/evg/web/tools/inline-assets.mjs +119 -0
- package/dist/lib/evg/web/tools/minify.mjs +60 -0
- package/dist/lib/evg/web/tracer/build.mjs +87 -0
- package/dist/lib/evg/web/tracer/index.html +2805 -0
- package/dist/lib/evg/web/tracer/sample.png +0 -0
- package/dist/lib/evg/web/tracer/smoke.mjs +1162 -0
- package/dist/lib/evgr/Cargo.lock +21 -0
- package/dist/lib/evgr/Cargo.toml +19 -0
- package/dist/lib/evgr/README.md +140 -0
- package/dist/lib/evgr/bench/NativeBench.rgr +246 -0
- package/dist/lib/evgr/bench/compare.mjs +252 -0
- package/dist/lib/evgr/bench/speed.mjs +277 -0
- package/dist/lib/evgr/bin/.gitignore +3 -0
- package/dist/lib/evgr/src/bin/bench.rs +106 -0
- package/dist/lib/evgr/src/bin/smoke.rs +13 -0
- package/dist/lib/evgr/src/grid.rs +730 -0
- package/dist/lib/evgr/src/lib.rs +1003 -0
- package/dist/lib/evgr/src/style.rs +468 -0
- package/dist/lib/evgr/src/text.rs +83 -0
- package/dist/lib/image/BitReader.rgr +171 -0
- package/dist/lib/image/Buffer.rgr +173 -0
- package/dist/lib/image/DCT.rgr +283 -0
- package/dist/lib/image/Deflate.rgr +339 -0
- package/dist/lib/image/HuffmanDecoder.rgr +181 -0
- package/dist/lib/image/ImageBuffer.rgr +706 -0
- package/dist/lib/image/JPEGDecoder.rgr +808 -0
- package/dist/lib/image/PNGDecoder.rgr +544 -0
- package/dist/lib/image/PNGEncoder.rgr +388 -0
- package/dist/lib/image/PPMImage.rgr +224 -0
- package/dist/lib/image/ProgressiveJPEGDecoder.rgr +1154 -0
- package/dist/lib/image/README.md +33 -0
- package/dist/lib/image/RasterBuffer.rgr +294 -0
- package/dist/lib/image/VP8BoolDecoder.rgr +163 -0
- package/dist/lib/image/WebPDecoder.rgr +433 -0
- package/dist/lib/image/WebPLossless.rgr +1035 -0
- package/dist/lib/image/WebPLossy.rgr +1929 -0
- package/dist/lib/image/ranger.json +9 -0
- package/dist/lib/image/testdata/webp/anim_2f_24x16.webp +0 -0
- package/dist/lib/image/testdata/webp/fixtures.txt +33 -0
- package/dist/lib/image/testdata/webp/gen_fixtures.py +261 -0
- package/dist/lib/image/testdata/webp/ll_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_alpha_29x21.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_gradient_64x64.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_meta_32x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_noise_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal11_23x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal2_19x7.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal40_16x16.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal4_13x5.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_photo_40x30.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_predictors_64x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alpha_33x17.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_exif_15x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_i16_96x80.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_nofilter_24x20.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_odd_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_photo_48x40.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_q100_20x18.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_sharp_40x36.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_simple_filter_33x31.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_parts8_37x45.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_skip_96x80.webp +0 -0
- package/dist/lib/image/tests/WebPDecodeTool.rgr +81 -0
- package/dist/lib/image/tests/WebPDecoderTest.rgr +1162 -0
- package/dist/lib/image/tests/run_webp_tests.sh +39 -0
- package/dist/lib/rust/RsJson.rgr +468 -0
- package/dist/lib/rust/RsPrelude.rgr +1663 -0
- package/dist/lib/shell_test.rgr +7 -7
- package/dist/lib/stdlib.rgr +21 -5
- package/dist/lib/zip/ranger.json +6 -0
- package/dist/rgrc.js +87318 -67610
- package/package.json +1010 -1040
- package/dist/README.md +0 -117
- package/dist/package.json +0 -47
|
@@ -0,0 +1,1929 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; WebPLossy.rgr - the VP8 key frame decoder behind lossy WebP (RFC 6386,
|
|
4
|
+
; RFC 9649 section 2.5): frame header, segmentation, token probabilities,
|
|
5
|
+
; coefficients and dequantization, intra prediction (16x16, the ten 4x4
|
|
6
|
+
; modes, chroma), inverse DCT / WHT, the simple and the normal loop filter,
|
|
7
|
+
; and YUV 4:2:0 to RGBA with the "fancy" upsampler libwebp uses by default.
|
|
8
|
+
;
|
|
9
|
+
; The decoding logic follows libwebp (src/dec/vp8_dec.c, tree_dec.c,
|
|
10
|
+
; frame_dec.c, src/dsp/dec.c, upsampling.c, yuv.h), Copyright Google Inc.,
|
|
11
|
+
; BSD-3-Clause, as condensed by simplewebp; the output matches libwebp byte
|
|
12
|
+
; for byte. The constant tables are the ones printed in RFC 6386. This port
|
|
13
|
+
; is MIT like the rest of lib/image.
|
|
14
|
+
;
|
|
15
|
+
; The reconstruction keeps libwebp's scratch layout: one 32-byte-stride block
|
|
16
|
+
; (yuvB) holding the macroblock being predicted with its top and left
|
|
17
|
+
; neighbours, so the edge cases (127 above the image, 129 left of it, the
|
|
18
|
+
; top-right samples of 4x4 prediction) come out exactly as libwebp's.
|
|
19
|
+
|
|
20
|
+
Import "VP8BoolDecoder.rgr"
|
|
21
|
+
Import "ImageBuffer.rgr"
|
|
22
|
+
|
|
23
|
+
class VP8Decoder {
|
|
24
|
+
def error:string ""
|
|
25
|
+
def width:int 0
|
|
26
|
+
def height:int 0
|
|
27
|
+
def mbW:int 0
|
|
28
|
+
def mbH:int 0
|
|
29
|
+
def maxPixels:int 100000000
|
|
30
|
+
|
|
31
|
+
def br:VP8BoolDecoder (new VP8BoolDecoder())
|
|
32
|
+
def parts:[VP8BoolDecoder]
|
|
33
|
+
def numParts:int 1
|
|
34
|
+
|
|
35
|
+
; segment header
|
|
36
|
+
def useSegment:boolean false
|
|
37
|
+
def updateMap:boolean false
|
|
38
|
+
def absoluteDelta:boolean true
|
|
39
|
+
def segQuant:int_buffer (int_buffer_alloc 4)
|
|
40
|
+
def segFilter:int_buffer (int_buffer_alloc 4)
|
|
41
|
+
def segProba:int_buffer (int_buffer_alloc 3)
|
|
42
|
+
|
|
43
|
+
; filter header
|
|
44
|
+
def filterSimple:int 0
|
|
45
|
+
def filterLevel:int 0
|
|
46
|
+
def sharpness:int 0
|
|
47
|
+
def useLfDelta:int 0
|
|
48
|
+
def refLfDelta:int_buffer (int_buffer_alloc 4)
|
|
49
|
+
def modeLfDelta:int_buffer (int_buffer_alloc 4)
|
|
50
|
+
def filterType:int 0
|
|
51
|
+
; per segment and 4x4-ness: limit, ilevel, inner, hev threshold
|
|
52
|
+
def fstr:int_buffer (int_buffer_alloc 32)
|
|
53
|
+
|
|
54
|
+
; dequantization, per segment: y1 dc, y1 ac, y2 dc, y2 ac, uv dc, uv ac
|
|
55
|
+
def dqm:int_buffer (int_buffer_alloc 24)
|
|
56
|
+
; coefficient probabilities [type 4][band 8][context 3][11]
|
|
57
|
+
def proba:int_buffer (int_buffer_alloc 1056)
|
|
58
|
+
def useSkipProba:int 0
|
|
59
|
+
def skipProba:int 0
|
|
60
|
+
|
|
61
|
+
; constant tables
|
|
62
|
+
def bands:int_buffer (int_buffer_alloc 17)
|
|
63
|
+
def zigzag:int_buffer (int_buffer_alloc 16)
|
|
64
|
+
def modesProbaT:int_buffer (int_buffer_alloc 900)
|
|
65
|
+
def dcTab:int_buffer (int_buffer_alloc 128)
|
|
66
|
+
def acTab:int_buffer (int_buffer_alloc 128)
|
|
67
|
+
|
|
68
|
+
; per macroblock row
|
|
69
|
+
def intraT:int_buffer (int_buffer_alloc 0)
|
|
70
|
+
def intraL:int_buffer (int_buffer_alloc 4)
|
|
71
|
+
def mbSegment:int_buffer (int_buffer_alloc 0)
|
|
72
|
+
def mbSkip:int_buffer (int_buffer_alloc 0)
|
|
73
|
+
def mbIsI4:int_buffer (int_buffer_alloc 0)
|
|
74
|
+
def mbUvMode:int_buffer (int_buffer_alloc 0)
|
|
75
|
+
def mbModes:int_buffer (int_buffer_alloc 0)
|
|
76
|
+
def topNz:int_buffer (int_buffer_alloc 0)
|
|
77
|
+
def topNzDc:int_buffer (int_buffer_alloc 0)
|
|
78
|
+
def leftNz:int 0
|
|
79
|
+
def leftNzDc:int 0
|
|
80
|
+
def fLimit:int_buffer (int_buffer_alloc 0)
|
|
81
|
+
def fILevel:int_buffer (int_buffer_alloc 0)
|
|
82
|
+
def fInner:int_buffer (int_buffer_alloc 0)
|
|
83
|
+
def fHev:int_buffer (int_buffer_alloc 0)
|
|
84
|
+
|
|
85
|
+
; the macroblock being decoded
|
|
86
|
+
def coeffs:int_buffer (int_buffer_alloc 384)
|
|
87
|
+
def nzCode:int_buffer (int_buffer_alloc 24)
|
|
88
|
+
def dcBuf:int_buffer (int_buffer_alloc 16)
|
|
89
|
+
def tmp:int_buffer (int_buffer_alloc 16)
|
|
90
|
+
|
|
91
|
+
; reconstruction scratch (stride 32) and saved top samples
|
|
92
|
+
def yuvB:buffer (buffer_alloc 832)
|
|
93
|
+
def yuvT:buffer (buffer_alloc 0)
|
|
94
|
+
|
|
95
|
+
; the decoded planes, padded to whole macroblocks
|
|
96
|
+
def yPlane:buffer (buffer_alloc 0)
|
|
97
|
+
def uPlane:buffer (buffer_alloc 0)
|
|
98
|
+
def vPlane:buffer (buffer_alloc 0)
|
|
99
|
+
def yStride:int 0
|
|
100
|
+
def uvStride:int 0
|
|
101
|
+
|
|
102
|
+
; what the last frame used (read by the tests)
|
|
103
|
+
def statI4Modes:int 0
|
|
104
|
+
def statI16Modes:int 0
|
|
105
|
+
def statUvModes:int 0
|
|
106
|
+
def statSkipped:int 0
|
|
107
|
+
def statSegments:int 0
|
|
108
|
+
|
|
109
|
+
Constructor () {
|
|
110
|
+
this.fillTable(bands ([] _:int (0 1 2 3 6 4 5 6 6 6 6 6 6 6 6 7 0)))
|
|
111
|
+
this.fillTable(zigzag ([] _:int (0 1 4 8 5 2 3 6 9 12 13 10 7 11 14 15)))
|
|
112
|
+
this.fillTable(modesProbaT (VP8Decoder.modesProba()))
|
|
113
|
+
this.fillTable(dcTab (VP8Decoder.dcTable()))
|
|
114
|
+
this.fillTable(acTab (VP8Decoder.acTable()))
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
fn fillTable:void (dst:int_buffer values:[int]) {
|
|
118
|
+
def i:int 0
|
|
119
|
+
def n:int (array_length values)
|
|
120
|
+
while (i < n) {
|
|
121
|
+
int_buffer_set dst i (itemAt values i)
|
|
122
|
+
i = i + 1
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
fn fail:boolean (msg:string) {
|
|
127
|
+
if ((strlen error) == 0) {
|
|
128
|
+
error = msg
|
|
129
|
+
}
|
|
130
|
+
return false
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
sfn clip:int (v:int m:int) {
|
|
134
|
+
if (v < 0) {
|
|
135
|
+
return 0
|
|
136
|
+
}
|
|
137
|
+
if (v > m) {
|
|
138
|
+
return m
|
|
139
|
+
}
|
|
140
|
+
return v
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
; int16 storage of the reference decoder
|
|
144
|
+
sfn wrap16:int (v:int) {
|
|
145
|
+
return ((bit_and (v + 32768) 65535) - 32768)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
; ======================================================================
|
|
149
|
+
; Frame header
|
|
150
|
+
; ======================================================================
|
|
151
|
+
|
|
152
|
+
; Parses the VP8 frame header of a 'VP8 ' chunk payload. On success the
|
|
153
|
+
; picture size is known and decodeFrame() can run.
|
|
154
|
+
fn decodeHeader:boolean (src:buffer start:int size:int maxDim:int) {
|
|
155
|
+
error = ""
|
|
156
|
+
if ((size < 10) || ((start + size) > (buffer_length src))) {
|
|
157
|
+
return (this.fail("VP8 chunk too small"))
|
|
158
|
+
}
|
|
159
|
+
def b0:int (buffer_get src start)
|
|
160
|
+
def b1:int (buffer_get src (start + 1))
|
|
161
|
+
def b2:int (buffer_get src (start + 2))
|
|
162
|
+
def tag:int (bit_or (bit_or b0 (bit_shl b1 8)) (bit_shl b2 16))
|
|
163
|
+
if ((bit_and tag 1) != 0) {
|
|
164
|
+
return (this.fail("not a key frame"))
|
|
165
|
+
}
|
|
166
|
+
if ((bit_and (bit_shr tag 1) 7) > 3) {
|
|
167
|
+
return (this.fail("unknown VP8 profile"))
|
|
168
|
+
}
|
|
169
|
+
if ((bit_and (bit_shr tag 4) 1) == 0) {
|
|
170
|
+
return (this.fail("frame not displayable"))
|
|
171
|
+
}
|
|
172
|
+
def partLen:int (bit_shr tag 5)
|
|
173
|
+
if (((buffer_get src (start + 3)) != 157) || ((buffer_get src (start + 4)) != 1) || ((buffer_get src (start + 5)) != 42)) {
|
|
174
|
+
return (this.fail("bad VP8 start code"))
|
|
175
|
+
}
|
|
176
|
+
width = (bit_and (bit_or (buffer_get src (start + 6)) (bit_shl (buffer_get src (start + 7)) 8)) 16383)
|
|
177
|
+
height = (bit_and (bit_or (buffer_get src (start + 8)) (bit_shl (buffer_get src (start + 9)) 8)) 16383)
|
|
178
|
+
if ((width == 0) || (height == 0)) {
|
|
179
|
+
return (this.fail("zero image size"))
|
|
180
|
+
}
|
|
181
|
+
if ((width > maxDim) || (height > maxDim) || (((to_double width) * (to_double height)) > (to_double maxPixels))) {
|
|
182
|
+
return (this.fail("image too large"))
|
|
183
|
+
}
|
|
184
|
+
if (partLen > (size - 10)) {
|
|
185
|
+
return (this.fail("bad partition length"))
|
|
186
|
+
}
|
|
187
|
+
mbW = (bit_shr (width + 15) 4)
|
|
188
|
+
mbH = (bit_shr (height + 15) 4)
|
|
189
|
+
|
|
190
|
+
br.init(src (start + 10) partLen)
|
|
191
|
+
br.getValue(1)
|
|
192
|
+
br.getValue(1)
|
|
193
|
+
|
|
194
|
+
; segment header
|
|
195
|
+
useSegment = false
|
|
196
|
+
updateMap = false
|
|
197
|
+
absoluteDelta = true
|
|
198
|
+
int_buffer_fill segQuant 0 0 4
|
|
199
|
+
int_buffer_fill segFilter 0 0 4
|
|
200
|
+
int_buffer_fill segProba 255 0 3
|
|
201
|
+
if ((br.getValue(1)) == 1) {
|
|
202
|
+
useSegment = true
|
|
203
|
+
updateMap = ((br.getValue(1)) == 1)
|
|
204
|
+
if ((br.getValue(1)) == 1) {
|
|
205
|
+
absoluteDelta = ((br.getValue(1)) == 1)
|
|
206
|
+
def s:int 0
|
|
207
|
+
while (s < 4) {
|
|
208
|
+
def qv:int 0
|
|
209
|
+
if ((br.getValue(1)) == 1) {
|
|
210
|
+
qv = (br.getSignedValue(7))
|
|
211
|
+
}
|
|
212
|
+
int_buffer_set segQuant s qv
|
|
213
|
+
s = s + 1
|
|
214
|
+
}
|
|
215
|
+
s = 0
|
|
216
|
+
while (s < 4) {
|
|
217
|
+
def fv:int 0
|
|
218
|
+
if ((br.getValue(1)) == 1) {
|
|
219
|
+
fv = (br.getSignedValue(6))
|
|
220
|
+
}
|
|
221
|
+
int_buffer_set segFilter s fv
|
|
222
|
+
s = s + 1
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if updateMap {
|
|
226
|
+
def s:int 0
|
|
227
|
+
while (s < 3) {
|
|
228
|
+
def pv:int 255
|
|
229
|
+
if ((br.getValue(1)) == 1) {
|
|
230
|
+
pv = (br.getValue(8))
|
|
231
|
+
}
|
|
232
|
+
int_buffer_set segProba s pv
|
|
233
|
+
s = s + 1
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if br.eof {
|
|
238
|
+
return (this.fail("cannot parse segment header"))
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
; filter header
|
|
242
|
+
filterSimple = (br.getValue(1))
|
|
243
|
+
filterLevel = (br.getValue(6))
|
|
244
|
+
sharpness = (br.getValue(3))
|
|
245
|
+
useLfDelta = (br.getValue(1))
|
|
246
|
+
int_buffer_fill refLfDelta 0 0 4
|
|
247
|
+
int_buffer_fill modeLfDelta 0 0 4
|
|
248
|
+
if (useLfDelta == 1) {
|
|
249
|
+
if ((br.getValue(1)) == 1) {
|
|
250
|
+
def i:int 0
|
|
251
|
+
while (i < 4) {
|
|
252
|
+
if ((br.getValue(1)) == 1) {
|
|
253
|
+
int_buffer_set refLfDelta i (br.getSignedValue(6))
|
|
254
|
+
}
|
|
255
|
+
i = i + 1
|
|
256
|
+
}
|
|
257
|
+
i = 0
|
|
258
|
+
while (i < 4) {
|
|
259
|
+
if ((br.getValue(1)) == 1) {
|
|
260
|
+
int_buffer_set modeLfDelta i (br.getSignedValue(6))
|
|
261
|
+
}
|
|
262
|
+
i = i + 1
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
filterType = 0
|
|
267
|
+
if (filterLevel != 0) {
|
|
268
|
+
filterType = 2
|
|
269
|
+
if (filterSimple == 1) {
|
|
270
|
+
filterType = 1
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if br.eof {
|
|
274
|
+
return (this.fail("cannot parse filter header"))
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
; token partitions
|
|
278
|
+
def pstart:int ((start + 10) + partLen)
|
|
279
|
+
def psize:int ((size - 10) - partLen)
|
|
280
|
+
def lastPart:int ((bit_shl 1 (br.getValue(2))) - 1)
|
|
281
|
+
numParts = lastPart + 1
|
|
282
|
+
if ((3 * lastPart) > psize) {
|
|
283
|
+
return (this.fail("cannot parse partitions"))
|
|
284
|
+
}
|
|
285
|
+
def emptyParts:[VP8BoolDecoder]
|
|
286
|
+
parts = emptyParts
|
|
287
|
+
def partStart:int (pstart + (lastPart * 3))
|
|
288
|
+
def sizeLeft:int (psize - (lastPart * 3))
|
|
289
|
+
def p:int 0
|
|
290
|
+
while (p < lastPart) {
|
|
291
|
+
def sz:int (pstart + (p * 3))
|
|
292
|
+
def plen:int (bit_or (bit_or (buffer_get src sz) (bit_shl (buffer_get src (sz + 1)) 8)) (bit_shl (buffer_get src (sz + 2)) 16))
|
|
293
|
+
if (plen > sizeLeft) {
|
|
294
|
+
plen = sizeLeft
|
|
295
|
+
}
|
|
296
|
+
def pd:VP8BoolDecoder (new VP8BoolDecoder())
|
|
297
|
+
pd.init(src partStart plen)
|
|
298
|
+
push parts pd
|
|
299
|
+
partStart = partStart + plen
|
|
300
|
+
sizeLeft = sizeLeft - plen
|
|
301
|
+
p = p + 1
|
|
302
|
+
}
|
|
303
|
+
def lastDec:VP8BoolDecoder (new VP8BoolDecoder())
|
|
304
|
+
lastDec.init(src partStart sizeLeft)
|
|
305
|
+
push parts lastDec
|
|
306
|
+
if (partStart >= (pstart + psize)) {
|
|
307
|
+
return (this.fail("cannot parse partitions"))
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
; quantizers
|
|
311
|
+
def baseQ:int (br.getValue(7))
|
|
312
|
+
def dqy1dc:int (this.readDelta())
|
|
313
|
+
def dqy2dc:int (this.readDelta())
|
|
314
|
+
def dqy2ac:int (this.readDelta())
|
|
315
|
+
def dquvdc:int (this.readDelta())
|
|
316
|
+
def dquvac:int (this.readDelta())
|
|
317
|
+
def s:int 0
|
|
318
|
+
while (s < 4) {
|
|
319
|
+
def q:int baseQ
|
|
320
|
+
if useSegment {
|
|
321
|
+
q = (int_buffer_get segQuant s)
|
|
322
|
+
if (absoluteDelta == false) {
|
|
323
|
+
q = q + baseQ
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
def m:int (s * 6)
|
|
327
|
+
int_buffer_set dqm m (int_buffer_get dcTab (VP8Decoder.clip((q + dqy1dc) 127)))
|
|
328
|
+
int_buffer_set dqm (m + 1) (int_buffer_get acTab (VP8Decoder.clip(q 127)))
|
|
329
|
+
int_buffer_set dqm (m + 2) ((int_buffer_get dcTab (VP8Decoder.clip((q + dqy2dc) 127))) * 2)
|
|
330
|
+
def y2ac:int (bit_shr ((int_buffer_get acTab (VP8Decoder.clip((q + dqy2ac) 127))) * 101581) 16)
|
|
331
|
+
if (y2ac < 8) {
|
|
332
|
+
y2ac = 8
|
|
333
|
+
}
|
|
334
|
+
int_buffer_set dqm (m + 3) y2ac
|
|
335
|
+
int_buffer_set dqm (m + 4) (int_buffer_get dcTab (VP8Decoder.clip((q + dquvdc) 117)))
|
|
336
|
+
int_buffer_set dqm (m + 5) (int_buffer_get acTab (VP8Decoder.clip((q + dquvac) 127)))
|
|
337
|
+
s = s + 1
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
; refresh_entropy_probs is ignored, then the token probabilities
|
|
341
|
+
br.getValue(1)
|
|
342
|
+
def upd:[int] (VP8Decoder.coeffUpdateProba())
|
|
343
|
+
def def0:[int] (VP8Decoder.coeffProba0())
|
|
344
|
+
def i:int 0
|
|
345
|
+
while (i < 1056) {
|
|
346
|
+
def v:int (itemAt def0 i)
|
|
347
|
+
if ((br.getBit((itemAt upd i))) == 1) {
|
|
348
|
+
v = (br.getValue(8))
|
|
349
|
+
}
|
|
350
|
+
int_buffer_set proba i v
|
|
351
|
+
i = i + 1
|
|
352
|
+
}
|
|
353
|
+
useSkipProba = (br.getValue(1))
|
|
354
|
+
skipProba = 0
|
|
355
|
+
if (useSkipProba == 1) {
|
|
356
|
+
skipProba = (br.getValue(8))
|
|
357
|
+
}
|
|
358
|
+
return true
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
fn readDelta:int () {
|
|
362
|
+
if ((br.getValue(1)) == 1) {
|
|
363
|
+
return (br.getSignedValue(4))
|
|
364
|
+
}
|
|
365
|
+
return 0
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
; loop filter strengths per segment and per 4x4-ness (libwebp PrecomputeFilterStrengths)
|
|
369
|
+
fn computeFilterStrengths:void () {
|
|
370
|
+
int_buffer_fill fstr 0 0 32
|
|
371
|
+
if (filterType == 0) {
|
|
372
|
+
return
|
|
373
|
+
}
|
|
374
|
+
def s:int 0
|
|
375
|
+
while (s < 4) {
|
|
376
|
+
def baseLevel:int filterLevel
|
|
377
|
+
if useSegment {
|
|
378
|
+
baseLevel = (int_buffer_get segFilter s)
|
|
379
|
+
if (absoluteDelta == false) {
|
|
380
|
+
baseLevel = baseLevel + filterLevel
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
def i4:int 0
|
|
384
|
+
while (i4 <= 1) {
|
|
385
|
+
def o:int (((s * 2) + i4) * 4)
|
|
386
|
+
def level:int baseLevel
|
|
387
|
+
if (useLfDelta == 1) {
|
|
388
|
+
level = level + (int_buffer_get refLfDelta 0)
|
|
389
|
+
if (i4 == 1) {
|
|
390
|
+
level = level + (int_buffer_get modeLfDelta 0)
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
level = (VP8Decoder.clip(level 63))
|
|
394
|
+
if (level > 0) {
|
|
395
|
+
def ilevel:int level
|
|
396
|
+
if (sharpness > 0) {
|
|
397
|
+
if (sharpness > 4) {
|
|
398
|
+
ilevel = (bit_shr ilevel 2)
|
|
399
|
+
} {
|
|
400
|
+
ilevel = (bit_shr ilevel 1)
|
|
401
|
+
}
|
|
402
|
+
if (ilevel > (9 - sharpness)) {
|
|
403
|
+
ilevel = 9 - sharpness
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (ilevel < 1) {
|
|
407
|
+
ilevel = 1
|
|
408
|
+
}
|
|
409
|
+
int_buffer_set fstr o ((2 * level) + ilevel)
|
|
410
|
+
int_buffer_set fstr (o + 1) ilevel
|
|
411
|
+
def hev:int 0
|
|
412
|
+
if (level >= 15) {
|
|
413
|
+
hev = 1
|
|
414
|
+
}
|
|
415
|
+
if (level >= 40) {
|
|
416
|
+
hev = 2
|
|
417
|
+
}
|
|
418
|
+
int_buffer_set fstr (o + 3) hev
|
|
419
|
+
} {
|
|
420
|
+
int_buffer_set fstr o 0
|
|
421
|
+
}
|
|
422
|
+
int_buffer_set fstr (o + 2) i4
|
|
423
|
+
i4 = i4 + 1
|
|
424
|
+
}
|
|
425
|
+
s = s + 1
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
; ======================================================================
|
|
430
|
+
; Modes and residuals
|
|
431
|
+
; ======================================================================
|
|
432
|
+
|
|
433
|
+
fn parseIntraMode:void (mbX:int) {
|
|
434
|
+
def seg:int 0
|
|
435
|
+
if updateMap {
|
|
436
|
+
if ((br.getBit((int_buffer_get segProba 0))) == 0) {
|
|
437
|
+
seg = (br.getBit((int_buffer_get segProba 1)))
|
|
438
|
+
} {
|
|
439
|
+
seg = (br.getBit((int_buffer_get segProba 2))) + 2
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
int_buffer_set mbSegment mbX seg
|
|
443
|
+
statSegments = (bit_or statSegments (bit_shl 1 seg))
|
|
444
|
+
def skip:int 0
|
|
445
|
+
if (useSkipProba == 1) {
|
|
446
|
+
skip = (br.getBit(skipProba))
|
|
447
|
+
}
|
|
448
|
+
int_buffer_set mbSkip mbX skip
|
|
449
|
+
def isI4:int 0
|
|
450
|
+
if ((br.getBit(145)) == 0) {
|
|
451
|
+
isI4 = 1
|
|
452
|
+
}
|
|
453
|
+
int_buffer_set mbIsI4 mbX isI4
|
|
454
|
+
def top:int (4 * mbX)
|
|
455
|
+
def mo:int (16 * mbX)
|
|
456
|
+
if (isI4 == 0) {
|
|
457
|
+
def ymode:int 0
|
|
458
|
+
if ((br.getBit(156)) == 1) {
|
|
459
|
+
if ((br.getBit(128)) == 1) {
|
|
460
|
+
ymode = 1
|
|
461
|
+
} {
|
|
462
|
+
ymode = 3
|
|
463
|
+
}
|
|
464
|
+
} {
|
|
465
|
+
if ((br.getBit(163)) == 1) {
|
|
466
|
+
ymode = 2
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
statI16Modes = (bit_or statI16Modes (bit_shl 1 ymode))
|
|
470
|
+
int_buffer_set mbModes mo ymode
|
|
471
|
+
int_buffer_fill intraT ymode top (top + 4)
|
|
472
|
+
int_buffer_fill intraL ymode 0 4
|
|
473
|
+
} {
|
|
474
|
+
def y:int 0
|
|
475
|
+
while (y < 4) {
|
|
476
|
+
def ymode:int (int_buffer_get intraL y)
|
|
477
|
+
def x:int 0
|
|
478
|
+
while (x < 4) {
|
|
479
|
+
def pb:int ((((int_buffer_get intraT (top + x)) * 10) + ymode) * 9)
|
|
480
|
+
ymode = (this.readI4Mode(pb))
|
|
481
|
+
statI4Modes = (bit_or statI4Modes (bit_shl 1 ymode))
|
|
482
|
+
int_buffer_set intraT (top + x) ymode
|
|
483
|
+
int_buffer_set mbModes ((mo + (y * 4)) + x) ymode
|
|
484
|
+
x = x + 1
|
|
485
|
+
}
|
|
486
|
+
int_buffer_set intraL y ymode
|
|
487
|
+
y = y + 1
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
def uv:int 0
|
|
491
|
+
if ((br.getBit(142)) == 1) {
|
|
492
|
+
if ((br.getBit(114)) == 0) {
|
|
493
|
+
uv = 2
|
|
494
|
+
} {
|
|
495
|
+
if ((br.getBit(183)) == 1) {
|
|
496
|
+
uv = 1
|
|
497
|
+
} {
|
|
498
|
+
uv = 3
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
statUvModes = (bit_or statUvModes (bit_shl 1 uv))
|
|
503
|
+
int_buffer_set mbUvMode mbX uv
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
; the 4x4 mode tree of RFC 6386 section 11.2
|
|
507
|
+
fn readI4Mode:int (pb:int) {
|
|
508
|
+
if ((br.getBit((int_buffer_get modesProbaT pb))) == 0) {
|
|
509
|
+
return 0
|
|
510
|
+
}
|
|
511
|
+
if ((br.getBit((int_buffer_get modesProbaT (pb + 1)))) == 0) {
|
|
512
|
+
return 1
|
|
513
|
+
}
|
|
514
|
+
if ((br.getBit((int_buffer_get modesProbaT (pb + 2)))) == 0) {
|
|
515
|
+
return 2
|
|
516
|
+
}
|
|
517
|
+
if ((br.getBit((int_buffer_get modesProbaT (pb + 3)))) == 0) {
|
|
518
|
+
if ((br.getBit((int_buffer_get modesProbaT (pb + 4)))) == 0) {
|
|
519
|
+
return 3
|
|
520
|
+
}
|
|
521
|
+
if ((br.getBit((int_buffer_get modesProbaT (pb + 5)))) == 0) {
|
|
522
|
+
return 4
|
|
523
|
+
}
|
|
524
|
+
return 5
|
|
525
|
+
}
|
|
526
|
+
if ((br.getBit((int_buffer_get modesProbaT (pb + 6)))) == 0) {
|
|
527
|
+
return 6
|
|
528
|
+
}
|
|
529
|
+
if ((br.getBit((int_buffer_get modesProbaT (pb + 7)))) == 0) {
|
|
530
|
+
return 7
|
|
531
|
+
}
|
|
532
|
+
if ((br.getBit((int_buffer_get modesProbaT (pb + 8)))) == 0) {
|
|
533
|
+
return 8
|
|
534
|
+
}
|
|
535
|
+
return 9
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
; offset of the 11 probabilities for coefficient type t at position n, context ctx
|
|
539
|
+
fn probaAt:int (t:int n:int ctx:int) {
|
|
540
|
+
return (((((t * 8) + (int_buffer_get bands n)) * 3) + ctx) * 11)
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
fn getLargeValue:int (tb:VP8BoolDecoder p:int) {
|
|
544
|
+
def v:int 0
|
|
545
|
+
if ((tb.getBit((int_buffer_get proba (p + 3)))) == 0) {
|
|
546
|
+
if ((tb.getBit((int_buffer_get proba (p + 4)))) == 0) {
|
|
547
|
+
return 2
|
|
548
|
+
}
|
|
549
|
+
return (3 + (tb.getBit((int_buffer_get proba (p + 5)))))
|
|
550
|
+
}
|
|
551
|
+
if ((tb.getBit((int_buffer_get proba (p + 6)))) == 0) {
|
|
552
|
+
if ((tb.getBit((int_buffer_get proba (p + 7)))) == 0) {
|
|
553
|
+
return (5 + (tb.getBit(159)))
|
|
554
|
+
}
|
|
555
|
+
v = 7 + (2 * (tb.getBit(165)))
|
|
556
|
+
v = v + (tb.getBit(145))
|
|
557
|
+
return v
|
|
558
|
+
}
|
|
559
|
+
def bit1:int (tb.getBit((int_buffer_get proba (p + 8))))
|
|
560
|
+
def bit0:int (tb.getBit((int_buffer_get proba ((p + 9) + bit1))))
|
|
561
|
+
def cat:int ((2 * bit1) + bit0)
|
|
562
|
+
v = 0
|
|
563
|
+
if (cat == 0) {
|
|
564
|
+
v = v + v + (tb.getBit(173))
|
|
565
|
+
v = v + v + (tb.getBit(148))
|
|
566
|
+
v = v + v + (tb.getBit(140))
|
|
567
|
+
}
|
|
568
|
+
if (cat == 1) {
|
|
569
|
+
v = v + v + (tb.getBit(176))
|
|
570
|
+
v = v + v + (tb.getBit(155))
|
|
571
|
+
v = v + v + (tb.getBit(140))
|
|
572
|
+
v = v + v + (tb.getBit(135))
|
|
573
|
+
}
|
|
574
|
+
if (cat == 2) {
|
|
575
|
+
v = v + v + (tb.getBit(180))
|
|
576
|
+
v = v + v + (tb.getBit(157))
|
|
577
|
+
v = v + v + (tb.getBit(141))
|
|
578
|
+
v = v + v + (tb.getBit(134))
|
|
579
|
+
v = v + v + (tb.getBit(130))
|
|
580
|
+
}
|
|
581
|
+
if (cat == 3) {
|
|
582
|
+
v = v + v + (tb.getBit(254))
|
|
583
|
+
v = v + v + (tb.getBit(254))
|
|
584
|
+
v = v + v + (tb.getBit(243))
|
|
585
|
+
v = v + v + (tb.getBit(230))
|
|
586
|
+
v = v + v + (tb.getBit(196))
|
|
587
|
+
v = v + v + (tb.getBit(177))
|
|
588
|
+
v = v + v + (tb.getBit(153))
|
|
589
|
+
v = v + v + (tb.getBit(140))
|
|
590
|
+
v = v + v + (tb.getBit(133))
|
|
591
|
+
v = v + v + (tb.getBit(130))
|
|
592
|
+
v = v + v + (tb.getBit(129))
|
|
593
|
+
}
|
|
594
|
+
return (v + 3 + (bit_shl 8 cat))
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
; Decodes the tokens of one 4x4 block from position n; returns the index
|
|
598
|
+
; after the last non-zero coefficient (16 when a run of zeros ends it).
|
|
599
|
+
fn getCoeffs:int (tb:VP8BoolDecoder t:int ctx:int dq0:int dq1:int n0:int out:int_buffer off:int) {
|
|
600
|
+
def n:int n0
|
|
601
|
+
def p:int (this.probaAt(t n ctx))
|
|
602
|
+
while (n < 16) {
|
|
603
|
+
if ((tb.getBit((int_buffer_get proba p))) == 0) {
|
|
604
|
+
return n
|
|
605
|
+
}
|
|
606
|
+
while ((tb.getBit((int_buffer_get proba (p + 1)))) == 0) {
|
|
607
|
+
n = n + 1
|
|
608
|
+
if (n == 16) {
|
|
609
|
+
return 16
|
|
610
|
+
}
|
|
611
|
+
p = (this.probaAt(t n 0))
|
|
612
|
+
}
|
|
613
|
+
def v:int 1
|
|
614
|
+
def next:int 0
|
|
615
|
+
if ((tb.getBit((int_buffer_get proba (p + 2)))) == 0) {
|
|
616
|
+
next = (this.probaAt(t (n + 1) 1))
|
|
617
|
+
} {
|
|
618
|
+
v = (this.getLargeValue(tb p))
|
|
619
|
+
next = (this.probaAt(t (n + 1) 2))
|
|
620
|
+
}
|
|
621
|
+
def dq:int dq1
|
|
622
|
+
if (n == 0) {
|
|
623
|
+
dq = dq0
|
|
624
|
+
}
|
|
625
|
+
int_buffer_set out (off + (int_buffer_get zigzag n)) (VP8Decoder.wrap16(((tb.getSigned(v)) * dq)))
|
|
626
|
+
p = next
|
|
627
|
+
n = n + 1
|
|
628
|
+
}
|
|
629
|
+
return 16
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
sfn nzCodeOf:int (nz:int dcNonZero:int) {
|
|
633
|
+
if (nz > 3) {
|
|
634
|
+
return 3
|
|
635
|
+
}
|
|
636
|
+
if (nz > 1) {
|
|
637
|
+
return 2
|
|
638
|
+
}
|
|
639
|
+
return dcNonZero
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
; inverse Walsh-Hadamard transform of the 16 luma DC values
|
|
643
|
+
fn transformWHT:void () {
|
|
644
|
+
def i:int 0
|
|
645
|
+
while (i < 4) {
|
|
646
|
+
def a0:int ((int_buffer_get dcBuf i) + (int_buffer_get dcBuf (i + 12)))
|
|
647
|
+
def a1:int ((int_buffer_get dcBuf (i + 4)) + (int_buffer_get dcBuf (i + 8)))
|
|
648
|
+
def a2:int ((int_buffer_get dcBuf (i + 4)) - (int_buffer_get dcBuf (i + 8)))
|
|
649
|
+
def a3:int ((int_buffer_get dcBuf i) - (int_buffer_get dcBuf (i + 12)))
|
|
650
|
+
int_buffer_set tmp i (a0 + a1)
|
|
651
|
+
int_buffer_set tmp (i + 8) (a0 - a1)
|
|
652
|
+
int_buffer_set tmp (i + 4) (a3 + a2)
|
|
653
|
+
int_buffer_set tmp (i + 12) (a3 - a2)
|
|
654
|
+
i = i + 1
|
|
655
|
+
}
|
|
656
|
+
i = 0
|
|
657
|
+
while (i < 4) {
|
|
658
|
+
def dc:int ((int_buffer_get tmp (i * 4)) + 3)
|
|
659
|
+
def a0:int (dc + (int_buffer_get tmp ((i * 4) + 3)))
|
|
660
|
+
def a1:int ((int_buffer_get tmp ((i * 4) + 1)) + (int_buffer_get tmp ((i * 4) + 2)))
|
|
661
|
+
def a2:int ((int_buffer_get tmp ((i * 4) + 1)) - (int_buffer_get tmp ((i * 4) + 2)))
|
|
662
|
+
def a3:int (dc - (int_buffer_get tmp ((i * 4) + 3)))
|
|
663
|
+
int_buffer_set coeffs (i * 64) (VP8Decoder.wrap16((bit_shr (a0 + a1) 3)))
|
|
664
|
+
int_buffer_set coeffs ((i * 64) + 16) (VP8Decoder.wrap16((bit_shr (a3 + a2) 3)))
|
|
665
|
+
int_buffer_set coeffs ((i * 64) + 32) (VP8Decoder.wrap16((bit_shr (a0 - a1) 3)))
|
|
666
|
+
int_buffer_set coeffs ((i * 64) + 48) (VP8Decoder.wrap16((bit_shr (a3 - a2) 3)))
|
|
667
|
+
i = i + 1
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
; Returns 1 when the macroblock has no non-zero coefficient.
|
|
672
|
+
fn parseResiduals:int (tb:VP8BoolDecoder mbX:int seg:int isI4:int) {
|
|
673
|
+
def q:int (seg * 6)
|
|
674
|
+
int_buffer_fill coeffs 0 0 384
|
|
675
|
+
def first:int 0
|
|
676
|
+
def acType:int 3
|
|
677
|
+
if (isI4 == 0) {
|
|
678
|
+
int_buffer_fill dcBuf 0 0 16
|
|
679
|
+
def ctx:int ((int_buffer_get topNzDc mbX) + leftNzDc)
|
|
680
|
+
def nz:int (this.getCoeffs(tb 1 ctx (int_buffer_get dqm (q + 2)) (int_buffer_get dqm (q + 3)) 0 dcBuf 0))
|
|
681
|
+
def hasDc:int 0
|
|
682
|
+
if (nz > 0) {
|
|
683
|
+
hasDc = 1
|
|
684
|
+
}
|
|
685
|
+
int_buffer_set topNzDc mbX hasDc
|
|
686
|
+
leftNzDc = hasDc
|
|
687
|
+
if (nz > 1) {
|
|
688
|
+
this.transformWHT()
|
|
689
|
+
} {
|
|
690
|
+
def dc0:int (VP8Decoder.wrap16((bit_shr ((int_buffer_get dcBuf 0) + 3) 3)))
|
|
691
|
+
def k:int 0
|
|
692
|
+
while (k < 16) {
|
|
693
|
+
int_buffer_set coeffs (k * 16) dc0
|
|
694
|
+
k = k + 1
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
first = 1
|
|
698
|
+
acType = 0
|
|
699
|
+
}
|
|
700
|
+
def dq0:int (int_buffer_get dqm q)
|
|
701
|
+
def dq1:int (int_buffer_get dqm (q + 1))
|
|
702
|
+
def origTop:int (int_buffer_get topNz mbX)
|
|
703
|
+
def tnz:int (bit_and origTop 15)
|
|
704
|
+
def lnz:int (bit_and leftNz 15)
|
|
705
|
+
def dst:int 0
|
|
706
|
+
def allZero:int 1
|
|
707
|
+
def y:int 0
|
|
708
|
+
while (y < 4) {
|
|
709
|
+
def l:int (bit_and lnz 1)
|
|
710
|
+
def x:int 0
|
|
711
|
+
while (x < 4) {
|
|
712
|
+
def ctx:int (l + (bit_and tnz 1))
|
|
713
|
+
def nz:int (this.getCoeffs(tb acType ctx dq0 dq1 first coeffs dst))
|
|
714
|
+
l = 0
|
|
715
|
+
if (nz > first) {
|
|
716
|
+
l = 1
|
|
717
|
+
}
|
|
718
|
+
tnz = (bit_or (bit_shr tnz 1) (bit_shl l 7))
|
|
719
|
+
def dcnz:int 0
|
|
720
|
+
if ((int_buffer_get coeffs dst) != 0) {
|
|
721
|
+
dcnz = 1
|
|
722
|
+
}
|
|
723
|
+
def code:int (VP8Decoder.nzCodeOf(nz dcnz))
|
|
724
|
+
int_buffer_set nzCode ((y * 4) + x) code
|
|
725
|
+
if (code != 0) {
|
|
726
|
+
allZero = 0
|
|
727
|
+
}
|
|
728
|
+
dst = dst + 16
|
|
729
|
+
x = x + 1
|
|
730
|
+
}
|
|
731
|
+
tnz = (bit_shr tnz 4)
|
|
732
|
+
lnz = (bit_or (bit_shr lnz 1) (bit_shl l 7))
|
|
733
|
+
y = y + 1
|
|
734
|
+
}
|
|
735
|
+
def outT:int tnz
|
|
736
|
+
def outL:int (bit_shr lnz 4)
|
|
737
|
+
def uq0:int (int_buffer_get dqm (q + 4))
|
|
738
|
+
def uq1:int (int_buffer_get dqm (q + 5))
|
|
739
|
+
def ch:int 0
|
|
740
|
+
while (ch < 4) {
|
|
741
|
+
tnz = (bit_shr origTop (4 + ch))
|
|
742
|
+
lnz = (bit_shr leftNz (4 + ch))
|
|
743
|
+
def cy:int 0
|
|
744
|
+
while (cy < 2) {
|
|
745
|
+
def l:int (bit_and lnz 1)
|
|
746
|
+
def cx:int 0
|
|
747
|
+
while (cx < 2) {
|
|
748
|
+
def ctx:int (l + (bit_and tnz 1))
|
|
749
|
+
def nz:int (this.getCoeffs(tb 2 ctx uq0 uq1 0 coeffs dst))
|
|
750
|
+
l = 0
|
|
751
|
+
if (nz > 0) {
|
|
752
|
+
l = 1
|
|
753
|
+
}
|
|
754
|
+
tnz = (bit_or (bit_shr tnz 1) (bit_shl l 3))
|
|
755
|
+
def dcnz:int 0
|
|
756
|
+
if ((int_buffer_get coeffs dst) != 0) {
|
|
757
|
+
dcnz = 1
|
|
758
|
+
}
|
|
759
|
+
def code:int (VP8Decoder.nzCodeOf(nz dcnz))
|
|
760
|
+
int_buffer_set nzCode (((16 + (ch * 2)) + (cy * 2)) + cx) code
|
|
761
|
+
if (code != 0) {
|
|
762
|
+
allZero = 0
|
|
763
|
+
}
|
|
764
|
+
dst = dst + 16
|
|
765
|
+
cx = cx + 1
|
|
766
|
+
}
|
|
767
|
+
tnz = (bit_shr tnz 2)
|
|
768
|
+
lnz = (bit_or (bit_shr lnz 1) (bit_shl l 5))
|
|
769
|
+
cy = cy + 1
|
|
770
|
+
}
|
|
771
|
+
outT = (bit_or outT (bit_shl (bit_shl tnz 4) ch))
|
|
772
|
+
outL = (bit_or outL (bit_shl (bit_and lnz 240) ch))
|
|
773
|
+
ch = ch + 2
|
|
774
|
+
}
|
|
775
|
+
int_buffer_set topNz mbX outT
|
|
776
|
+
leftNz = outL
|
|
777
|
+
return allZero
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
fn decodeMB:boolean (tb:VP8BoolDecoder mbX:int) {
|
|
781
|
+
def seg:int (int_buffer_get mbSegment mbX)
|
|
782
|
+
def isI4:int (int_buffer_get mbIsI4 mbX)
|
|
783
|
+
def skip:int 0
|
|
784
|
+
if (useSkipProba == 1) {
|
|
785
|
+
skip = (int_buffer_get mbSkip mbX)
|
|
786
|
+
}
|
|
787
|
+
if (skip == 0) {
|
|
788
|
+
skip = (this.parseResiduals(tb mbX seg isI4))
|
|
789
|
+
} {
|
|
790
|
+
statSkipped = statSkipped + 1
|
|
791
|
+
leftNz = 0
|
|
792
|
+
int_buffer_set topNz mbX 0
|
|
793
|
+
if (isI4 == 0) {
|
|
794
|
+
leftNzDc = 0
|
|
795
|
+
int_buffer_set topNzDc mbX 0
|
|
796
|
+
}
|
|
797
|
+
int_buffer_fill nzCode 0 0 24
|
|
798
|
+
}
|
|
799
|
+
if (filterType > 0) {
|
|
800
|
+
def o:int (((seg * 2) + isI4) * 4)
|
|
801
|
+
int_buffer_set fLimit mbX (int_buffer_get fstr o)
|
|
802
|
+
int_buffer_set fILevel mbX (int_buffer_get fstr (o + 1))
|
|
803
|
+
def inner:int (int_buffer_get fstr (o + 2))
|
|
804
|
+
if (skip == 0) {
|
|
805
|
+
inner = 1
|
|
806
|
+
}
|
|
807
|
+
int_buffer_set fInner mbX inner
|
|
808
|
+
int_buffer_set fHev mbX (int_buffer_get fstr (o + 3))
|
|
809
|
+
}
|
|
810
|
+
return (tb.eof == false)
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
; ======================================================================
|
|
814
|
+
; Intra prediction on the scratch block (stride 32)
|
|
815
|
+
; ======================================================================
|
|
816
|
+
|
|
817
|
+
fn px:int (i:int) {
|
|
818
|
+
return (buffer_get yuvB i)
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
fn put:void (i:int v:int) {
|
|
822
|
+
buffer_set yuvB i v
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
sfn avg3:int (a:int b:int c:int) {
|
|
826
|
+
return (bit_shr ((a + (2 * b)) + (c + 2)) 2)
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
sfn avg2:int (a:int b:int) {
|
|
830
|
+
return (bit_shr ((a + b) + 1) 1)
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
fn fillBlock:void (dst:int size:int v:int) {
|
|
834
|
+
def j:int 0
|
|
835
|
+
while (j < size) {
|
|
836
|
+
buffer_fill yuvB v (dst + (j * 32)) ((dst + (j * 32)) + size)
|
|
837
|
+
j = j + 1
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
fn trueMotion:void (dst:int size:int) {
|
|
842
|
+
def top:int (dst - 32)
|
|
843
|
+
def tl:int (this.px((top - 1)))
|
|
844
|
+
def y:int 0
|
|
845
|
+
while (y < size) {
|
|
846
|
+
def row:int (dst + (y * 32))
|
|
847
|
+
def l:int (this.px((row - 1)))
|
|
848
|
+
def x:int 0
|
|
849
|
+
while (x < size) {
|
|
850
|
+
this.put((row + x) (VP8Decoder.clip((((this.px((top + x))) + l) - tl) 255)))
|
|
851
|
+
x = x + 1
|
|
852
|
+
}
|
|
853
|
+
y = y + 1
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
fn predLuma4:void (mode:int d:int) {
|
|
858
|
+
def t:int (d - 32)
|
|
859
|
+
if (mode == 0) {
|
|
860
|
+
def dc:int 4
|
|
861
|
+
def i:int 0
|
|
862
|
+
while (i < 4) {
|
|
863
|
+
dc = dc + (this.px((t + i))) + (this.px(((d - 1) + (i * 32))))
|
|
864
|
+
i = i + 1
|
|
865
|
+
}
|
|
866
|
+
this.fillBlock(d 4 (bit_shr dc 3))
|
|
867
|
+
return
|
|
868
|
+
}
|
|
869
|
+
if (mode == 1) {
|
|
870
|
+
this.trueMotion(d 4)
|
|
871
|
+
return
|
|
872
|
+
}
|
|
873
|
+
if (mode == 2) {
|
|
874
|
+
def v0:int (VP8Decoder.avg3((this.px((t - 1))) (this.px(t)) (this.px((t + 1)))))
|
|
875
|
+
def v1:int (VP8Decoder.avg3((this.px(t)) (this.px((t + 1))) (this.px((t + 2)))))
|
|
876
|
+
def v2:int (VP8Decoder.avg3((this.px((t + 1))) (this.px((t + 2))) (this.px((t + 3)))))
|
|
877
|
+
def v3:int (VP8Decoder.avg3((this.px((t + 2))) (this.px((t + 3))) (this.px((t + 4)))))
|
|
878
|
+
def j:int 0
|
|
879
|
+
while (j < 4) {
|
|
880
|
+
def r:int (d + (j * 32))
|
|
881
|
+
this.put(r v0)
|
|
882
|
+
this.put((r + 1) v1)
|
|
883
|
+
this.put((r + 2) v2)
|
|
884
|
+
this.put((r + 3) v3)
|
|
885
|
+
j = j + 1
|
|
886
|
+
}
|
|
887
|
+
return
|
|
888
|
+
}
|
|
889
|
+
; left column I J K L, corner X, top A B C D E F G H
|
|
890
|
+
def ci:int (this.px((d - 1)))
|
|
891
|
+
def cj:int (this.px((d + 31)))
|
|
892
|
+
def ck:int (this.px((d + 63)))
|
|
893
|
+
def cl:int (this.px((d + 95)))
|
|
894
|
+
def cx:int (this.px((t - 1)))
|
|
895
|
+
def ca:int (this.px(t))
|
|
896
|
+
def cb:int (this.px((t + 1)))
|
|
897
|
+
def cc:int (this.px((t + 2)))
|
|
898
|
+
def cd:int (this.px((t + 3)))
|
|
899
|
+
if (mode == 3) {
|
|
900
|
+
buffer_fill yuvB (VP8Decoder.avg3(cx ci cj)) d (d + 4)
|
|
901
|
+
buffer_fill yuvB (VP8Decoder.avg3(ci cj ck)) (d + 32) (d + 36)
|
|
902
|
+
buffer_fill yuvB (VP8Decoder.avg3(cj ck cl)) (d + 64) (d + 68)
|
|
903
|
+
buffer_fill yuvB (VP8Decoder.avg3(ck cl cl)) (d + 96) (d + 100)
|
|
904
|
+
return
|
|
905
|
+
}
|
|
906
|
+
if (mode == 4) {
|
|
907
|
+
this.put((d + 96) (VP8Decoder.avg3(cj ck cl)))
|
|
908
|
+
def e1:int (VP8Decoder.avg3(ci cj ck))
|
|
909
|
+
this.put((d + 97) e1)
|
|
910
|
+
this.put((d + 64) e1)
|
|
911
|
+
def e2:int (VP8Decoder.avg3(cx ci cj))
|
|
912
|
+
this.put((d + 98) e2)
|
|
913
|
+
this.put((d + 65) e2)
|
|
914
|
+
this.put((d + 32) e2)
|
|
915
|
+
def e3:int (VP8Decoder.avg3(ca cx ci))
|
|
916
|
+
this.put((d + 99) e3)
|
|
917
|
+
this.put((d + 66) e3)
|
|
918
|
+
this.put((d + 33) e3)
|
|
919
|
+
this.put(d e3)
|
|
920
|
+
def e4:int (VP8Decoder.avg3(cb ca cx))
|
|
921
|
+
this.put((d + 67) e4)
|
|
922
|
+
this.put((d + 34) e4)
|
|
923
|
+
this.put((d + 1) e4)
|
|
924
|
+
def e5:int (VP8Decoder.avg3(cc cb ca))
|
|
925
|
+
this.put((d + 35) e5)
|
|
926
|
+
this.put((d + 2) e5)
|
|
927
|
+
this.put((d + 3) (VP8Decoder.avg3(cd cc cb)))
|
|
928
|
+
return
|
|
929
|
+
}
|
|
930
|
+
if (mode == 5) {
|
|
931
|
+
def f1:int (VP8Decoder.avg2(cx ca))
|
|
932
|
+
this.put(d f1)
|
|
933
|
+
this.put((d + 65) f1)
|
|
934
|
+
def f2:int (VP8Decoder.avg2(ca cb))
|
|
935
|
+
this.put((d + 1) f2)
|
|
936
|
+
this.put((d + 66) f2)
|
|
937
|
+
def f3:int (VP8Decoder.avg2(cb cc))
|
|
938
|
+
this.put((d + 2) f3)
|
|
939
|
+
this.put((d + 67) f3)
|
|
940
|
+
this.put((d + 3) (VP8Decoder.avg2(cc cd)))
|
|
941
|
+
this.put((d + 96) (VP8Decoder.avg3(ck cj ci)))
|
|
942
|
+
this.put((d + 64) (VP8Decoder.avg3(cj ci cx)))
|
|
943
|
+
def f4:int (VP8Decoder.avg3(ci cx ca))
|
|
944
|
+
this.put((d + 32) f4)
|
|
945
|
+
this.put((d + 97) f4)
|
|
946
|
+
def f5:int (VP8Decoder.avg3(cx ca cb))
|
|
947
|
+
this.put((d + 33) f5)
|
|
948
|
+
this.put((d + 98) f5)
|
|
949
|
+
def f6:int (VP8Decoder.avg3(ca cb cc))
|
|
950
|
+
this.put((d + 34) f6)
|
|
951
|
+
this.put((d + 99) f6)
|
|
952
|
+
this.put((d + 35) (VP8Decoder.avg3(cb cc cd)))
|
|
953
|
+
return
|
|
954
|
+
}
|
|
955
|
+
def ce:int (this.px((t + 4)))
|
|
956
|
+
def cf:int (this.px((t + 5)))
|
|
957
|
+
def cg:int (this.px((t + 6)))
|
|
958
|
+
def ch:int (this.px((t + 7)))
|
|
959
|
+
if (mode == 6) {
|
|
960
|
+
this.put(d (VP8Decoder.avg3(ca cb cc)))
|
|
961
|
+
def g1:int (VP8Decoder.avg3(cb cc cd))
|
|
962
|
+
this.put((d + 1) g1)
|
|
963
|
+
this.put((d + 32) g1)
|
|
964
|
+
def g2:int (VP8Decoder.avg3(cc cd ce))
|
|
965
|
+
this.put((d + 2) g2)
|
|
966
|
+
this.put((d + 33) g2)
|
|
967
|
+
this.put((d + 64) g2)
|
|
968
|
+
def g3:int (VP8Decoder.avg3(cd ce cf))
|
|
969
|
+
this.put((d + 3) g3)
|
|
970
|
+
this.put((d + 34) g3)
|
|
971
|
+
this.put((d + 65) g3)
|
|
972
|
+
this.put((d + 96) g3)
|
|
973
|
+
def g4:int (VP8Decoder.avg3(ce cf cg))
|
|
974
|
+
this.put((d + 35) g4)
|
|
975
|
+
this.put((d + 66) g4)
|
|
976
|
+
this.put((d + 97) g4)
|
|
977
|
+
def g5:int (VP8Decoder.avg3(cf cg ch))
|
|
978
|
+
this.put((d + 67) g5)
|
|
979
|
+
this.put((d + 98) g5)
|
|
980
|
+
this.put((d + 99) (VP8Decoder.avg3(cg ch ch)))
|
|
981
|
+
return
|
|
982
|
+
}
|
|
983
|
+
if (mode == 7) {
|
|
984
|
+
this.put(d (VP8Decoder.avg2(ca cb)))
|
|
985
|
+
def h1:int (VP8Decoder.avg2(cb cc))
|
|
986
|
+
this.put((d + 1) h1)
|
|
987
|
+
this.put((d + 64) h1)
|
|
988
|
+
def h2:int (VP8Decoder.avg2(cc cd))
|
|
989
|
+
this.put((d + 2) h2)
|
|
990
|
+
this.put((d + 65) h2)
|
|
991
|
+
def h3:int (VP8Decoder.avg2(cd ce))
|
|
992
|
+
this.put((d + 3) h3)
|
|
993
|
+
this.put((d + 66) h3)
|
|
994
|
+
this.put((d + 32) (VP8Decoder.avg3(ca cb cc)))
|
|
995
|
+
def h4:int (VP8Decoder.avg3(cb cc cd))
|
|
996
|
+
this.put((d + 33) h4)
|
|
997
|
+
this.put((d + 96) h4)
|
|
998
|
+
def h5:int (VP8Decoder.avg3(cc cd ce))
|
|
999
|
+
this.put((d + 34) h5)
|
|
1000
|
+
this.put((d + 97) h5)
|
|
1001
|
+
def h6:int (VP8Decoder.avg3(cd ce cf))
|
|
1002
|
+
this.put((d + 35) h6)
|
|
1003
|
+
this.put((d + 98) h6)
|
|
1004
|
+
this.put((d + 67) (VP8Decoder.avg3(ce cf cg)))
|
|
1005
|
+
this.put((d + 99) (VP8Decoder.avg3(cf cg ch)))
|
|
1006
|
+
return
|
|
1007
|
+
}
|
|
1008
|
+
if (mode == 8) {
|
|
1009
|
+
def k1:int (VP8Decoder.avg2(ci cx))
|
|
1010
|
+
this.put(d k1)
|
|
1011
|
+
this.put((d + 34) k1)
|
|
1012
|
+
def k2:int (VP8Decoder.avg2(cj ci))
|
|
1013
|
+
this.put((d + 32) k2)
|
|
1014
|
+
this.put((d + 66) k2)
|
|
1015
|
+
def k3:int (VP8Decoder.avg2(ck cj))
|
|
1016
|
+
this.put((d + 64) k3)
|
|
1017
|
+
this.put((d + 98) k3)
|
|
1018
|
+
this.put((d + 96) (VP8Decoder.avg2(cl ck)))
|
|
1019
|
+
this.put((d + 3) (VP8Decoder.avg3(ca cb cc)))
|
|
1020
|
+
this.put((d + 2) (VP8Decoder.avg3(cx ca cb)))
|
|
1021
|
+
def k4:int (VP8Decoder.avg3(ci cx ca))
|
|
1022
|
+
this.put((d + 1) k4)
|
|
1023
|
+
this.put((d + 35) k4)
|
|
1024
|
+
def k5:int (VP8Decoder.avg3(cj ci cx))
|
|
1025
|
+
this.put((d + 33) k5)
|
|
1026
|
+
this.put((d + 67) k5)
|
|
1027
|
+
def k6:int (VP8Decoder.avg3(ck cj ci))
|
|
1028
|
+
this.put((d + 65) k6)
|
|
1029
|
+
this.put((d + 99) k6)
|
|
1030
|
+
this.put((d + 97) (VP8Decoder.avg3(cl ck cj)))
|
|
1031
|
+
return
|
|
1032
|
+
}
|
|
1033
|
+
; mode 9, horizontal-up
|
|
1034
|
+
this.put(d (VP8Decoder.avg2(ci cj)))
|
|
1035
|
+
def m1:int (VP8Decoder.avg2(cj ck))
|
|
1036
|
+
this.put((d + 2) m1)
|
|
1037
|
+
this.put((d + 32) m1)
|
|
1038
|
+
def m2:int (VP8Decoder.avg2(ck cl))
|
|
1039
|
+
this.put((d + 34) m2)
|
|
1040
|
+
this.put((d + 64) m2)
|
|
1041
|
+
this.put((d + 1) (VP8Decoder.avg3(ci cj ck)))
|
|
1042
|
+
def m3:int (VP8Decoder.avg3(cj ck cl))
|
|
1043
|
+
this.put((d + 3) m3)
|
|
1044
|
+
this.put((d + 33) m3)
|
|
1045
|
+
def m4:int (VP8Decoder.avg3(ck cl cl))
|
|
1046
|
+
this.put((d + 35) m4)
|
|
1047
|
+
this.put((d + 65) m4)
|
|
1048
|
+
this.put((d + 66) cl)
|
|
1049
|
+
this.put((d + 67) cl)
|
|
1050
|
+
buffer_fill yuvB cl (d + 96) (d + 100)
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
; 16x16 luma (size 16) and 8x8 chroma (size 8) prediction; modes 4..6 are
|
|
1054
|
+
; the DC variants without top, without left, and without either.
|
|
1055
|
+
fn predBlock:void (mode:int d:int size:int) {
|
|
1056
|
+
def shift:int 4
|
|
1057
|
+
if (size == 8) {
|
|
1058
|
+
shift = 3
|
|
1059
|
+
}
|
|
1060
|
+
if (mode == 0) {
|
|
1061
|
+
def dc:int size
|
|
1062
|
+
def j:int 0
|
|
1063
|
+
while (j < size) {
|
|
1064
|
+
dc = dc + (this.px(((d - 1) + (j * 32)))) + (this.px(((d - 32) + j)))
|
|
1065
|
+
j = j + 1
|
|
1066
|
+
}
|
|
1067
|
+
this.fillBlock(d size (bit_shr dc (shift + 1)))
|
|
1068
|
+
return
|
|
1069
|
+
}
|
|
1070
|
+
if (mode == 1) {
|
|
1071
|
+
this.trueMotion(d size)
|
|
1072
|
+
return
|
|
1073
|
+
}
|
|
1074
|
+
if (mode == 2) {
|
|
1075
|
+
def j:int 0
|
|
1076
|
+
while (j < size) {
|
|
1077
|
+
buffer_copy yuvB (d + (j * 32)) yuvB (d - 32) size
|
|
1078
|
+
j = j + 1
|
|
1079
|
+
}
|
|
1080
|
+
return
|
|
1081
|
+
}
|
|
1082
|
+
if (mode == 3) {
|
|
1083
|
+
def j:int 0
|
|
1084
|
+
while (j < size) {
|
|
1085
|
+
def r:int (d + (j * 32))
|
|
1086
|
+
buffer_fill yuvB (this.px((r - 1))) r (r + size)
|
|
1087
|
+
j = j + 1
|
|
1088
|
+
}
|
|
1089
|
+
return
|
|
1090
|
+
}
|
|
1091
|
+
if (mode == 4) {
|
|
1092
|
+
def dc:int (bit_shr size 1)
|
|
1093
|
+
def j:int 0
|
|
1094
|
+
while (j < size) {
|
|
1095
|
+
dc = dc + (this.px(((d - 1) + (j * 32))))
|
|
1096
|
+
j = j + 1
|
|
1097
|
+
}
|
|
1098
|
+
this.fillBlock(d size (bit_shr dc shift))
|
|
1099
|
+
return
|
|
1100
|
+
}
|
|
1101
|
+
if (mode == 5) {
|
|
1102
|
+
def dc:int (bit_shr size 1)
|
|
1103
|
+
def j:int 0
|
|
1104
|
+
while (j < size) {
|
|
1105
|
+
dc = dc + (this.px(((d - 32) + j)))
|
|
1106
|
+
j = j + 1
|
|
1107
|
+
}
|
|
1108
|
+
this.fillBlock(d size (bit_shr dc shift))
|
|
1109
|
+
return
|
|
1110
|
+
}
|
|
1111
|
+
this.fillBlock(d size 128)
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
sfn checkMode:int (mbX:int mbY:int mode:int) {
|
|
1115
|
+
if (mode == 0) {
|
|
1116
|
+
if (mbX == 0) {
|
|
1117
|
+
if (mbY == 0) {
|
|
1118
|
+
return 6
|
|
1119
|
+
}
|
|
1120
|
+
return 5
|
|
1121
|
+
}
|
|
1122
|
+
if (mbY == 0) {
|
|
1123
|
+
return 4
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
return mode
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
; ======================================================================
|
|
1130
|
+
; Inverse transforms, added to the prediction in the scratch block
|
|
1131
|
+
; ======================================================================
|
|
1132
|
+
|
|
1133
|
+
sfn mul1:int (a:int) {
|
|
1134
|
+
return ((bit_shr (a * 20091) 16) + a)
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
sfn mul2:int (a:int) {
|
|
1138
|
+
return (bit_shr (a * 35468) 16)
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
fn store:void (d:int v:int) {
|
|
1142
|
+
this.put(d (VP8Decoder.clip(((this.px(d)) + (bit_shr v 3)) 255)))
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
fn transformOne:void (src:int d:int) {
|
|
1146
|
+
def i:int 0
|
|
1147
|
+
while (i < 4) {
|
|
1148
|
+
def in0:int (int_buffer_get coeffs (src + i))
|
|
1149
|
+
def in4:int (int_buffer_get coeffs ((src + 4) + i))
|
|
1150
|
+
def in8:int (int_buffer_get coeffs ((src + 8) + i))
|
|
1151
|
+
def in12:int (int_buffer_get coeffs ((src + 12) + i))
|
|
1152
|
+
def a:int (in0 + in8)
|
|
1153
|
+
def b:int (in0 - in8)
|
|
1154
|
+
def c:int ((VP8Decoder.mul2(in4)) - (VP8Decoder.mul1(in12)))
|
|
1155
|
+
def e:int ((VP8Decoder.mul1(in4)) + (VP8Decoder.mul2(in12)))
|
|
1156
|
+
int_buffer_set tmp (i * 4) (a + e)
|
|
1157
|
+
int_buffer_set tmp ((i * 4) + 1) (b + c)
|
|
1158
|
+
int_buffer_set tmp ((i * 4) + 2) (b - c)
|
|
1159
|
+
int_buffer_set tmp ((i * 4) + 3) (a - e)
|
|
1160
|
+
i = i + 1
|
|
1161
|
+
}
|
|
1162
|
+
i = 0
|
|
1163
|
+
while (i < 4) {
|
|
1164
|
+
def dc:int ((int_buffer_get tmp i) + 4)
|
|
1165
|
+
def t4:int (int_buffer_get tmp (i + 4))
|
|
1166
|
+
def t8:int (int_buffer_get tmp (i + 8))
|
|
1167
|
+
def t12:int (int_buffer_get tmp (i + 12))
|
|
1168
|
+
def a:int (dc + t8)
|
|
1169
|
+
def b:int (dc - t8)
|
|
1170
|
+
def c:int ((VP8Decoder.mul2(t4)) - (VP8Decoder.mul1(t12)))
|
|
1171
|
+
def e:int ((VP8Decoder.mul1(t4)) + (VP8Decoder.mul2(t12)))
|
|
1172
|
+
def r:int (d + (i * 32))
|
|
1173
|
+
this.store(r (a + e))
|
|
1174
|
+
this.store((r + 1) (b + c))
|
|
1175
|
+
this.store((r + 2) (b - c))
|
|
1176
|
+
this.store((r + 3) (a - e))
|
|
1177
|
+
i = i + 1
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
fn transformDC:void (src:int d:int) {
|
|
1182
|
+
def dc:int ((int_buffer_get coeffs src) + 4)
|
|
1183
|
+
def j:int 0
|
|
1184
|
+
while (j < 4) {
|
|
1185
|
+
def r:int (d + (j * 32))
|
|
1186
|
+
this.store(r dc)
|
|
1187
|
+
this.store((r + 1) dc)
|
|
1188
|
+
this.store((r + 2) dc)
|
|
1189
|
+
this.store((r + 3) dc)
|
|
1190
|
+
j = j + 1
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
fn store2:void (r:int dc:int e:int c:int) {
|
|
1195
|
+
this.store(r (dc + e))
|
|
1196
|
+
this.store((r + 1) (dc + c))
|
|
1197
|
+
this.store((r + 2) (dc - c))
|
|
1198
|
+
this.store((r + 3) (dc - e))
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
fn transformAC3:void (src:int d:int) {
|
|
1202
|
+
def a:int ((int_buffer_get coeffs src) + 4)
|
|
1203
|
+
def in4:int (int_buffer_get coeffs (src + 4))
|
|
1204
|
+
def in1:int (int_buffer_get coeffs (src + 1))
|
|
1205
|
+
def c4:int (VP8Decoder.mul2(in4))
|
|
1206
|
+
def d4:int (VP8Decoder.mul1(in4))
|
|
1207
|
+
def c1:int (VP8Decoder.mul2(in1))
|
|
1208
|
+
def d1:int (VP8Decoder.mul1(in1))
|
|
1209
|
+
this.store2(d (a + d4) d1 c1)
|
|
1210
|
+
this.store2((d + 32) (a + c4) d1 c1)
|
|
1211
|
+
this.store2((d + 64) (a - c4) d1 c1)
|
|
1212
|
+
this.store2((d + 96) (a - d4) d1 c1)
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
; by the 2-bit code of the block: 3 full, 2 first row and column, 1 DC
|
|
1216
|
+
fn doTransform:void (code:int src:int d:int) {
|
|
1217
|
+
if (code == 3) {
|
|
1218
|
+
this.transformOne(src d)
|
|
1219
|
+
return
|
|
1220
|
+
}
|
|
1221
|
+
if (code == 2) {
|
|
1222
|
+
this.transformAC3(src d)
|
|
1223
|
+
return
|
|
1224
|
+
}
|
|
1225
|
+
if (code == 1) {
|
|
1226
|
+
this.transformDC(src d)
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
; the four 4x4 blocks of a chroma plane; first is the index of their codes
|
|
1231
|
+
fn doTransformUV:void (first:int src:int d:int) {
|
|
1232
|
+
def any:boolean false
|
|
1233
|
+
def ac:boolean false
|
|
1234
|
+
def k:int 0
|
|
1235
|
+
while (k < 4) {
|
|
1236
|
+
def c:int (int_buffer_get nzCode (first + k))
|
|
1237
|
+
if (c != 0) {
|
|
1238
|
+
any = true
|
|
1239
|
+
}
|
|
1240
|
+
if (c >= 2) {
|
|
1241
|
+
ac = true
|
|
1242
|
+
}
|
|
1243
|
+
k = k + 1
|
|
1244
|
+
}
|
|
1245
|
+
if (any == false) {
|
|
1246
|
+
return
|
|
1247
|
+
}
|
|
1248
|
+
if ac {
|
|
1249
|
+
this.transformOne(src d)
|
|
1250
|
+
this.transformOne((src + 16) (d + 4))
|
|
1251
|
+
this.transformOne((src + 32) (d + 128))
|
|
1252
|
+
this.transformOne((src + 48) (d + 132))
|
|
1253
|
+
return
|
|
1254
|
+
}
|
|
1255
|
+
if ((int_buffer_get coeffs src) != 0) {
|
|
1256
|
+
this.transformDC(src d)
|
|
1257
|
+
}
|
|
1258
|
+
if ((int_buffer_get coeffs (src + 16)) != 0) {
|
|
1259
|
+
this.transformDC((src + 16) (d + 4))
|
|
1260
|
+
}
|
|
1261
|
+
if ((int_buffer_get coeffs (src + 32)) != 0) {
|
|
1262
|
+
this.transformDC((src + 32) (d + 128))
|
|
1263
|
+
}
|
|
1264
|
+
if ((int_buffer_get coeffs (src + 48)) != 0) {
|
|
1265
|
+
this.transformDC((src + 48) (d + 132))
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
; ======================================================================
|
|
1270
|
+
; Macroblock reconstruction
|
|
1271
|
+
; ======================================================================
|
|
1272
|
+
|
|
1273
|
+
fn reconstruct:void (mbX:int mbY:int) {
|
|
1274
|
+
def yd:int 40
|
|
1275
|
+
def ud:int 584
|
|
1276
|
+
def vd:int 600
|
|
1277
|
+
if (mbX == 0) {
|
|
1278
|
+
def j:int 0
|
|
1279
|
+
while (j < 16) {
|
|
1280
|
+
this.put(((yd + (j * 32)) - 1) 129)
|
|
1281
|
+
j = j + 1
|
|
1282
|
+
}
|
|
1283
|
+
j = 0
|
|
1284
|
+
while (j < 8) {
|
|
1285
|
+
this.put(((ud + (j * 32)) - 1) 129)
|
|
1286
|
+
this.put(((vd + (j * 32)) - 1) 129)
|
|
1287
|
+
j = j + 1
|
|
1288
|
+
}
|
|
1289
|
+
if (mbY > 0) {
|
|
1290
|
+
this.put((yd - 33) 129)
|
|
1291
|
+
this.put((ud - 33) 129)
|
|
1292
|
+
this.put((vd - 33) 129)
|
|
1293
|
+
} {
|
|
1294
|
+
buffer_fill yuvB 127 (yd - 33) ((yd - 33) + 21)
|
|
1295
|
+
buffer_fill yuvB 127 (ud - 33) ((ud - 33) + 9)
|
|
1296
|
+
buffer_fill yuvB 127 (vd - 33) ((vd - 33) + 9)
|
|
1297
|
+
}
|
|
1298
|
+
} {
|
|
1299
|
+
def j:int -1
|
|
1300
|
+
while (j < 16) {
|
|
1301
|
+
buffer_copy yuvB ((yd + (j * 32)) - 4) yuvB ((yd + (j * 32)) + 12) 4
|
|
1302
|
+
j = j + 1
|
|
1303
|
+
}
|
|
1304
|
+
j = -1
|
|
1305
|
+
while (j < 8) {
|
|
1306
|
+
buffer_copy yuvB ((ud + (j * 32)) - 4) yuvB ((ud + (j * 32)) + 4) 4
|
|
1307
|
+
buffer_copy yuvB ((vd + (j * 32)) - 4) yuvB ((vd + (j * 32)) + 4) 4
|
|
1308
|
+
j = j + 1
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
def topOff:int (mbX * 32)
|
|
1312
|
+
if (mbY > 0) {
|
|
1313
|
+
buffer_copy yuvB (yd - 32) yuvT topOff 16
|
|
1314
|
+
buffer_copy yuvB (ud - 32) yuvT (topOff + 16) 8
|
|
1315
|
+
buffer_copy yuvB (vd - 32) yuvT (topOff + 24) 8
|
|
1316
|
+
}
|
|
1317
|
+
def mo:int (mbX * 16)
|
|
1318
|
+
if ((int_buffer_get mbIsI4 mbX) == 1) {
|
|
1319
|
+
def tr:int ((yd - 32) + 16)
|
|
1320
|
+
if (mbY > 0) {
|
|
1321
|
+
if (mbX >= (mbW - 1)) {
|
|
1322
|
+
buffer_fill yuvB (buffer_get yuvT (topOff + 15)) tr (tr + 4)
|
|
1323
|
+
} {
|
|
1324
|
+
buffer_copy yuvB tr yuvT (topOff + 32) 4
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
buffer_copy yuvB (tr + 128) yuvB tr 4
|
|
1328
|
+
buffer_copy yuvB (tr + 256) yuvB tr 4
|
|
1329
|
+
buffer_copy yuvB (tr + 384) yuvB tr 4
|
|
1330
|
+
def n:int 0
|
|
1331
|
+
while (n < 16) {
|
|
1332
|
+
def d:int ((yd + ((bit_and n 3) * 4)) + ((bit_shr n 2) * 128))
|
|
1333
|
+
this.predLuma4((int_buffer_get mbModes (mo + n)) d)
|
|
1334
|
+
this.doTransform((int_buffer_get nzCode n) (n * 16) d)
|
|
1335
|
+
n = n + 1
|
|
1336
|
+
}
|
|
1337
|
+
} {
|
|
1338
|
+
this.predBlock((VP8Decoder.checkMode(mbX mbY (int_buffer_get mbModes mo))) yd 16)
|
|
1339
|
+
def n:int 0
|
|
1340
|
+
while (n < 16) {
|
|
1341
|
+
def code:int (int_buffer_get nzCode n)
|
|
1342
|
+
if (code != 0) {
|
|
1343
|
+
this.doTransform(code (n * 16) ((yd + ((bit_and n 3) * 4)) + ((bit_shr n 2) * 128)))
|
|
1344
|
+
}
|
|
1345
|
+
n = n + 1
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
def uvMode:int (VP8Decoder.checkMode(mbX mbY (int_buffer_get mbUvMode mbX)))
|
|
1349
|
+
this.predBlock(uvMode ud 8)
|
|
1350
|
+
this.predBlock(uvMode vd 8)
|
|
1351
|
+
this.doTransformUV(16 256 ud)
|
|
1352
|
+
this.doTransformUV(20 320 vd)
|
|
1353
|
+
if (mbY < (mbH - 1)) {
|
|
1354
|
+
buffer_copy yuvT topOff yuvB (yd + 480) 16
|
|
1355
|
+
buffer_copy yuvT (topOff + 16) yuvB (ud + 224) 8
|
|
1356
|
+
buffer_copy yuvT (topOff + 24) yuvB (vd + 224) 8
|
|
1357
|
+
}
|
|
1358
|
+
; into the frame
|
|
1359
|
+
def j:int 0
|
|
1360
|
+
def yo:int (((mbY * 16) * yStride) + (mbX * 16))
|
|
1361
|
+
while (j < 16) {
|
|
1362
|
+
buffer_copy yPlane (yo + (j * yStride)) yuvB (yd + (j * 32)) 16
|
|
1363
|
+
j = j + 1
|
|
1364
|
+
}
|
|
1365
|
+
def uo:int (((mbY * 8) * uvStride) + (mbX * 8))
|
|
1366
|
+
j = 0
|
|
1367
|
+
while (j < 8) {
|
|
1368
|
+
buffer_copy uPlane (uo + (j * uvStride)) yuvB (ud + (j * 32)) 8
|
|
1369
|
+
buffer_copy vPlane (uo + (j * uvStride)) yuvB (vd + (j * 32)) 8
|
|
1370
|
+
j = j + 1
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
; ======================================================================
|
|
1375
|
+
; Loop filter (on the frame planes)
|
|
1376
|
+
; ======================================================================
|
|
1377
|
+
|
|
1378
|
+
sfn sclip1:int (v:int) {
|
|
1379
|
+
if (v < -128) {
|
|
1380
|
+
return -128
|
|
1381
|
+
}
|
|
1382
|
+
if (v > 127) {
|
|
1383
|
+
return 127
|
|
1384
|
+
}
|
|
1385
|
+
return v
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
sfn sclip2:int (v:int) {
|
|
1389
|
+
if (v < -16) {
|
|
1390
|
+
return -16
|
|
1391
|
+
}
|
|
1392
|
+
if (v > 15) {
|
|
1393
|
+
return 15
|
|
1394
|
+
}
|
|
1395
|
+
return v
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
sfn clip1:int (v:int) {
|
|
1399
|
+
if (v < 0) {
|
|
1400
|
+
return 0
|
|
1401
|
+
}
|
|
1402
|
+
if (v > 255) {
|
|
1403
|
+
return 255
|
|
1404
|
+
}
|
|
1405
|
+
return v
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
sfn abs0:int (v:int) {
|
|
1409
|
+
if (v < 0) {
|
|
1410
|
+
return (0 - v)
|
|
1411
|
+
}
|
|
1412
|
+
return v
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
; 4 * |p0 - q0| + |p1 - q1| <= t
|
|
1416
|
+
fn needsFilter:boolean (b:buffer p:int step:int t:int) {
|
|
1417
|
+
def p1:int (buffer_get b (p - (2 * step)))
|
|
1418
|
+
def p0:int (buffer_get b (p - step))
|
|
1419
|
+
def q0:int (buffer_get b p)
|
|
1420
|
+
def q1:int (buffer_get b (p + step))
|
|
1421
|
+
return (((4 * (VP8Decoder.abs0((p0 - q0)))) + (VP8Decoder.abs0((p1 - q1)))) <= t)
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
fn needsFilter2:boolean (b:buffer p:int step:int t:int it:int) {
|
|
1425
|
+
def p3:int (buffer_get b (p - (4 * step)))
|
|
1426
|
+
def p2:int (buffer_get b (p - (3 * step)))
|
|
1427
|
+
def p1:int (buffer_get b (p - (2 * step)))
|
|
1428
|
+
def p0:int (buffer_get b (p - step))
|
|
1429
|
+
def q0:int (buffer_get b p)
|
|
1430
|
+
def q1:int (buffer_get b (p + step))
|
|
1431
|
+
def q2:int (buffer_get b (p + (2 * step)))
|
|
1432
|
+
def q3:int (buffer_get b (p + (3 * step)))
|
|
1433
|
+
if (((4 * (VP8Decoder.abs0((p0 - q0)))) + (VP8Decoder.abs0((p1 - q1)))) > t) {
|
|
1434
|
+
return false
|
|
1435
|
+
}
|
|
1436
|
+
if ((VP8Decoder.abs0((p3 - p2))) > it) {
|
|
1437
|
+
return false
|
|
1438
|
+
}
|
|
1439
|
+
if ((VP8Decoder.abs0((p2 - p1))) > it) {
|
|
1440
|
+
return false
|
|
1441
|
+
}
|
|
1442
|
+
if ((VP8Decoder.abs0((p1 - p0))) > it) {
|
|
1443
|
+
return false
|
|
1444
|
+
}
|
|
1445
|
+
if ((VP8Decoder.abs0((q3 - q2))) > it) {
|
|
1446
|
+
return false
|
|
1447
|
+
}
|
|
1448
|
+
if ((VP8Decoder.abs0((q2 - q1))) > it) {
|
|
1449
|
+
return false
|
|
1450
|
+
}
|
|
1451
|
+
return ((VP8Decoder.abs0((q1 - q0))) <= it)
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
fn hev:boolean (b:buffer p:int step:int thresh:int) {
|
|
1455
|
+
def p1:int (buffer_get b (p - (2 * step)))
|
|
1456
|
+
def p0:int (buffer_get b (p - step))
|
|
1457
|
+
def q0:int (buffer_get b p)
|
|
1458
|
+
def q1:int (buffer_get b (p + step))
|
|
1459
|
+
return (((VP8Decoder.abs0((p1 - p0))) > thresh) || ((VP8Decoder.abs0((q1 - q0))) > thresh))
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
fn doFilter2:void (b:buffer p:int step:int) {
|
|
1463
|
+
def p1:int (buffer_get b (p - (2 * step)))
|
|
1464
|
+
def p0:int (buffer_get b (p - step))
|
|
1465
|
+
def q0:int (buffer_get b p)
|
|
1466
|
+
def q1:int (buffer_get b (p + step))
|
|
1467
|
+
def a:int ((3 * (q0 - p0)) + (VP8Decoder.sclip1((p1 - q1))))
|
|
1468
|
+
def a1:int (VP8Decoder.sclip2((bit_shr (a + 4) 3)))
|
|
1469
|
+
def a2:int (VP8Decoder.sclip2((bit_shr (a + 3) 3)))
|
|
1470
|
+
buffer_set b (p - step) (VP8Decoder.clip1((p0 + a2)))
|
|
1471
|
+
buffer_set b p (VP8Decoder.clip1((q0 - a1)))
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
fn doFilter4:void (b:buffer p:int step:int) {
|
|
1475
|
+
def p1:int (buffer_get b (p - (2 * step)))
|
|
1476
|
+
def p0:int (buffer_get b (p - step))
|
|
1477
|
+
def q0:int (buffer_get b p)
|
|
1478
|
+
def q1:int (buffer_get b (p + step))
|
|
1479
|
+
def a:int (3 * (q0 - p0))
|
|
1480
|
+
def a1:int (VP8Decoder.sclip2((bit_shr (a + 4) 3)))
|
|
1481
|
+
def a2:int (VP8Decoder.sclip2((bit_shr (a + 3) 3)))
|
|
1482
|
+
def a3:int (bit_shr (a1 + 1) 1)
|
|
1483
|
+
buffer_set b (p - (2 * step)) (VP8Decoder.clip1((p1 + a3)))
|
|
1484
|
+
buffer_set b (p - step) (VP8Decoder.clip1((p0 + a2)))
|
|
1485
|
+
buffer_set b p (VP8Decoder.clip1((q0 - a1)))
|
|
1486
|
+
buffer_set b (p + step) (VP8Decoder.clip1((q1 - a3)))
|
|
1487
|
+
}
|
|
1488
|
+
|
|
1489
|
+
fn doFilter6:void (b:buffer p:int step:int) {
|
|
1490
|
+
def p2:int (buffer_get b (p - (3 * step)))
|
|
1491
|
+
def p1:int (buffer_get b (p - (2 * step)))
|
|
1492
|
+
def p0:int (buffer_get b (p - step))
|
|
1493
|
+
def q0:int (buffer_get b p)
|
|
1494
|
+
def q1:int (buffer_get b (p + step))
|
|
1495
|
+
def q2:int (buffer_get b (p + (2 * step)))
|
|
1496
|
+
def a:int (VP8Decoder.sclip1(((3 * (q0 - p0)) + (VP8Decoder.sclip1((p1 - q1))))))
|
|
1497
|
+
def a1:int (bit_shr ((27 * a) + 63) 7)
|
|
1498
|
+
def a2:int (bit_shr ((18 * a) + 63) 7)
|
|
1499
|
+
def a3:int (bit_shr ((9 * a) + 63) 7)
|
|
1500
|
+
buffer_set b (p - (3 * step)) (VP8Decoder.clip1((p2 + a3)))
|
|
1501
|
+
buffer_set b (p - (2 * step)) (VP8Decoder.clip1((p1 + a2)))
|
|
1502
|
+
buffer_set b (p - step) (VP8Decoder.clip1((p0 + a1)))
|
|
1503
|
+
buffer_set b p (VP8Decoder.clip1((q0 - a1)))
|
|
1504
|
+
buffer_set b (p + step) (VP8Decoder.clip1((q1 - a2)))
|
|
1505
|
+
buffer_set b (p + (2 * step)) (VP8Decoder.clip1((q2 - a3)))
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
; the simple filter across one edge of 16 pixels
|
|
1509
|
+
fn simpleFilter16:void (b:buffer p:int step:int along:int thresh:int) {
|
|
1510
|
+
def t2:int ((2 * thresh) + 1)
|
|
1511
|
+
def i:int 0
|
|
1512
|
+
while (i < 16) {
|
|
1513
|
+
def q:int (p + (i * along))
|
|
1514
|
+
if (this.needsFilter(b q step t2)) {
|
|
1515
|
+
this.doFilter2(b q step)
|
|
1516
|
+
}
|
|
1517
|
+
i = i + 1
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
; the normal filter across one edge: 6-tap on macroblock edges, 4-tap inside
|
|
1522
|
+
fn filterLoop:void (b:buffer p:int hstride:int vstride:int size:int thresh:int ithresh:int hevThresh:int mbEdge:boolean) {
|
|
1523
|
+
def t2:int ((2 * thresh) + 1)
|
|
1524
|
+
def i:int 0
|
|
1525
|
+
while (i < size) {
|
|
1526
|
+
def q:int (p + (i * vstride))
|
|
1527
|
+
if (this.needsFilter2(b q hstride t2 ithresh)) {
|
|
1528
|
+
if (this.hev(b q hstride hevThresh)) {
|
|
1529
|
+
this.doFilter2(b q hstride)
|
|
1530
|
+
} {
|
|
1531
|
+
if mbEdge {
|
|
1532
|
+
this.doFilter6(b q hstride)
|
|
1533
|
+
} {
|
|
1534
|
+
this.doFilter4(b q hstride)
|
|
1535
|
+
}
|
|
1536
|
+
}
|
|
1537
|
+
}
|
|
1538
|
+
i = i + 1
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
fn filterMB:void (mbX:int mbY:int) {
|
|
1543
|
+
def limit:int (int_buffer_get fLimit mbX)
|
|
1544
|
+
if (limit == 0) {
|
|
1545
|
+
return
|
|
1546
|
+
}
|
|
1547
|
+
def ilevel:int (int_buffer_get fILevel mbX)
|
|
1548
|
+
def inner:boolean ((int_buffer_get fInner mbX) == 1)
|
|
1549
|
+
def hevT:int (int_buffer_get fHev mbX)
|
|
1550
|
+
def ys:int yStride
|
|
1551
|
+
def yo:int (((mbY * 16) * ys) + (mbX * 16))
|
|
1552
|
+
if (filterType == 1) {
|
|
1553
|
+
if (mbX > 0) {
|
|
1554
|
+
this.simpleFilter16(yPlane yo 1 ys (limit + 4))
|
|
1555
|
+
}
|
|
1556
|
+
if inner {
|
|
1557
|
+
this.simpleFilter16(yPlane (yo + 4) 1 ys limit)
|
|
1558
|
+
this.simpleFilter16(yPlane (yo + 8) 1 ys limit)
|
|
1559
|
+
this.simpleFilter16(yPlane (yo + 12) 1 ys limit)
|
|
1560
|
+
}
|
|
1561
|
+
if (mbY > 0) {
|
|
1562
|
+
this.simpleFilter16(yPlane yo ys 1 (limit + 4))
|
|
1563
|
+
}
|
|
1564
|
+
if inner {
|
|
1565
|
+
this.simpleFilter16(yPlane (yo + (4 * ys)) ys 1 limit)
|
|
1566
|
+
this.simpleFilter16(yPlane (yo + (8 * ys)) ys 1 limit)
|
|
1567
|
+
this.simpleFilter16(yPlane (yo + (12 * ys)) ys 1 limit)
|
|
1568
|
+
}
|
|
1569
|
+
return
|
|
1570
|
+
}
|
|
1571
|
+
def us:int uvStride
|
|
1572
|
+
def uo:int (((mbY * 8) * us) + (mbX * 8))
|
|
1573
|
+
if (mbX > 0) {
|
|
1574
|
+
this.filterLoop(yPlane yo 1 ys 16 (limit + 4) ilevel hevT true)
|
|
1575
|
+
this.filterLoop(uPlane uo 1 us 8 (limit + 4) ilevel hevT true)
|
|
1576
|
+
this.filterLoop(vPlane uo 1 us 8 (limit + 4) ilevel hevT true)
|
|
1577
|
+
}
|
|
1578
|
+
if inner {
|
|
1579
|
+
this.filterLoop(yPlane (yo + 4) 1 ys 16 limit ilevel hevT false)
|
|
1580
|
+
this.filterLoop(yPlane (yo + 8) 1 ys 16 limit ilevel hevT false)
|
|
1581
|
+
this.filterLoop(yPlane (yo + 12) 1 ys 16 limit ilevel hevT false)
|
|
1582
|
+
this.filterLoop(uPlane (uo + 4) 1 us 8 limit ilevel hevT false)
|
|
1583
|
+
this.filterLoop(vPlane (uo + 4) 1 us 8 limit ilevel hevT false)
|
|
1584
|
+
}
|
|
1585
|
+
if (mbY > 0) {
|
|
1586
|
+
this.filterLoop(yPlane yo ys 1 16 (limit + 4) ilevel hevT true)
|
|
1587
|
+
this.filterLoop(uPlane uo us 1 8 (limit + 4) ilevel hevT true)
|
|
1588
|
+
this.filterLoop(vPlane uo us 1 8 (limit + 4) ilevel hevT true)
|
|
1589
|
+
}
|
|
1590
|
+
if inner {
|
|
1591
|
+
this.filterLoop(yPlane (yo + (4 * ys)) ys 1 16 limit ilevel hevT false)
|
|
1592
|
+
this.filterLoop(yPlane (yo + (8 * ys)) ys 1 16 limit ilevel hevT false)
|
|
1593
|
+
this.filterLoop(yPlane (yo + (12 * ys)) ys 1 16 limit ilevel hevT false)
|
|
1594
|
+
this.filterLoop(uPlane (uo + (4 * us)) us 1 8 limit ilevel hevT false)
|
|
1595
|
+
this.filterLoop(vPlane (uo + (4 * us)) us 1 8 limit ilevel hevT false)
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
; ======================================================================
|
|
1600
|
+
; Frame
|
|
1601
|
+
; ======================================================================
|
|
1602
|
+
|
|
1603
|
+
; Decodes the frame whose header decodeHeader() read into yPlane, uPlane
|
|
1604
|
+
; and vPlane.
|
|
1605
|
+
fn decodeFrame:boolean () {
|
|
1606
|
+
yStride = mbW * 16
|
|
1607
|
+
uvStride = mbW * 8
|
|
1608
|
+
yPlane = (buffer_alloc (yStride * (mbH * 16)))
|
|
1609
|
+
uPlane = (buffer_alloc (uvStride * (mbH * 8)))
|
|
1610
|
+
vPlane = (buffer_alloc (uvStride * (mbH * 8)))
|
|
1611
|
+
yuvT = (buffer_alloc (mbW * 32))
|
|
1612
|
+
intraT = (int_buffer_alloc (mbW * 4))
|
|
1613
|
+
mbSegment = (int_buffer_alloc mbW)
|
|
1614
|
+
mbSkip = (int_buffer_alloc mbW)
|
|
1615
|
+
mbIsI4 = (int_buffer_alloc mbW)
|
|
1616
|
+
mbUvMode = (int_buffer_alloc mbW)
|
|
1617
|
+
mbModes = (int_buffer_alloc (mbW * 16))
|
|
1618
|
+
topNz = (int_buffer_alloc mbW)
|
|
1619
|
+
topNzDc = (int_buffer_alloc mbW)
|
|
1620
|
+
fLimit = (int_buffer_alloc mbW)
|
|
1621
|
+
fILevel = (int_buffer_alloc mbW)
|
|
1622
|
+
fInner = (int_buffer_alloc mbW)
|
|
1623
|
+
fHev = (int_buffer_alloc mbW)
|
|
1624
|
+
buffer_fill yuvB 0 0 832
|
|
1625
|
+
statI4Modes = 0
|
|
1626
|
+
statI16Modes = 0
|
|
1627
|
+
statUvModes = 0
|
|
1628
|
+
statSkipped = 0
|
|
1629
|
+
statSegments = 0
|
|
1630
|
+
this.computeFilterStrengths()
|
|
1631
|
+
def mbY:int 0
|
|
1632
|
+
while (mbY < mbH) {
|
|
1633
|
+
def tb:VP8BoolDecoder (itemAt parts (bit_and mbY (numParts - 1)))
|
|
1634
|
+
int_buffer_fill intraL 0 0 4
|
|
1635
|
+
def mbX:int 0
|
|
1636
|
+
while (mbX < mbW) {
|
|
1637
|
+
this.parseIntraMode(mbX)
|
|
1638
|
+
mbX = mbX + 1
|
|
1639
|
+
}
|
|
1640
|
+
if br.eof {
|
|
1641
|
+
return (this.fail("premature end of partition 0"))
|
|
1642
|
+
}
|
|
1643
|
+
leftNz = 0
|
|
1644
|
+
leftNzDc = 0
|
|
1645
|
+
mbX = 0
|
|
1646
|
+
while (mbX < mbW) {
|
|
1647
|
+
if ((this.decodeMB(tb mbX)) == false) {
|
|
1648
|
+
return (this.fail("premature end of token partition"))
|
|
1649
|
+
}
|
|
1650
|
+
this.reconstruct(mbX mbY)
|
|
1651
|
+
mbX = mbX + 1
|
|
1652
|
+
}
|
|
1653
|
+
if (filterType > 0) {
|
|
1654
|
+
mbX = 0
|
|
1655
|
+
while (mbX < mbW) {
|
|
1656
|
+
this.filterMB(mbX mbY)
|
|
1657
|
+
mbX = mbX + 1
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
mbY = mbY + 1
|
|
1661
|
+
}
|
|
1662
|
+
return true
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
; ======================================================================
|
|
1666
|
+
; YUV 4:2:0 -> RGBA
|
|
1667
|
+
; ======================================================================
|
|
1668
|
+
|
|
1669
|
+
sfn yuvClip8:int (v:int) {
|
|
1670
|
+
if ((bit_and v -16384) == 0) {
|
|
1671
|
+
return (bit_shr v 6)
|
|
1672
|
+
}
|
|
1673
|
+
if (v < 0) {
|
|
1674
|
+
return 0
|
|
1675
|
+
}
|
|
1676
|
+
return 255
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
; One output row with libwebp's fancy upsampler: the chroma of each pixel
|
|
1680
|
+
; is (9 * nearest + 3 * two neighbours + farthest + 8) / 16 of the four
|
|
1681
|
+
; closest chroma samples. `near` is the chroma row closest to the pixel
|
|
1682
|
+
; row, `far` the other one of the pair.
|
|
1683
|
+
fn emitRow:void (img:ImageBuffer alpha:buffer hasAlpha:boolean row:int near:int far:int) {
|
|
1684
|
+
def w:int width
|
|
1685
|
+
def yo:int (row * yStride)
|
|
1686
|
+
def no:int (near * uvStride)
|
|
1687
|
+
def fo:int (far * uvStride)
|
|
1688
|
+
def out:int ((row * w) * 4)
|
|
1689
|
+
def ao:int (row * w)
|
|
1690
|
+
def x:int 0
|
|
1691
|
+
while (x < w) {
|
|
1692
|
+
def u:int 0
|
|
1693
|
+
def v:int 0
|
|
1694
|
+
def cx:int (bit_shr x 1)
|
|
1695
|
+
if ((x == 0) || (((bit_and w 1) == 0) && (x == (w - 1)))) {
|
|
1696
|
+
; first pixel, and the last one of an even width
|
|
1697
|
+
u = (bit_shr (((3 * (buffer_get uPlane (no + cx))) + (buffer_get uPlane (fo + cx))) + 2) 2)
|
|
1698
|
+
v = (bit_shr (((3 * (buffer_get vPlane (no + cx))) + (buffer_get vPlane (fo + cx))) + 2) 2)
|
|
1699
|
+
} {
|
|
1700
|
+
; pixels 2k - 1 and 2k fall between chroma columns k - 1 and k
|
|
1701
|
+
def k:int (bit_shr (x + 1) 1)
|
|
1702
|
+
def na:int (buffer_get uPlane ((no + k) - 1))
|
|
1703
|
+
def nb:int (buffer_get uPlane (no + k))
|
|
1704
|
+
def fa:int (buffer_get uPlane ((fo + k) - 1))
|
|
1705
|
+
def fb:int (buffer_get uPlane (fo + k))
|
|
1706
|
+
def avg:int ((((na + nb) + fa) + fb) + 8)
|
|
1707
|
+
if ((bit_and x 1) == 1) {
|
|
1708
|
+
u = (bit_shr ((bit_shr (avg + (2 * (nb + fa))) 3) + na) 1)
|
|
1709
|
+
} {
|
|
1710
|
+
u = (bit_shr ((bit_shr (avg + (2 * (na + fb))) 3) + nb) 1)
|
|
1711
|
+
}
|
|
1712
|
+
na = (buffer_get vPlane ((no + k) - 1))
|
|
1713
|
+
nb = (buffer_get vPlane (no + k))
|
|
1714
|
+
fa = (buffer_get vPlane ((fo + k) - 1))
|
|
1715
|
+
fb = (buffer_get vPlane (fo + k))
|
|
1716
|
+
avg = ((((na + nb) + fa) + fb) + 8)
|
|
1717
|
+
if ((bit_and x 1) == 1) {
|
|
1718
|
+
v = (bit_shr ((bit_shr (avg + (2 * (nb + fa))) 3) + na) 1)
|
|
1719
|
+
} {
|
|
1720
|
+
v = (bit_shr ((bit_shr (avg + (2 * (na + fb))) 3) + nb) 1)
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
def yy:int (bit_shr ((buffer_get yPlane (yo + x)) * 19077) 8)
|
|
1724
|
+
def o:int (out + (x * 4))
|
|
1725
|
+
buffer_set img.pixels o (VP8Decoder.yuvClip8(((yy + (bit_shr (v * 26149) 8)) - 14234)))
|
|
1726
|
+
buffer_set img.pixels (o + 1) (VP8Decoder.yuvClip8((((yy - (bit_shr (u * 6419) 8)) - (bit_shr (v * 13320) 8)) + 8708)))
|
|
1727
|
+
buffer_set img.pixels (o + 2) (VP8Decoder.yuvClip8(((yy + (bit_shr (u * 33050) 8)) - 17685)))
|
|
1728
|
+
if hasAlpha {
|
|
1729
|
+
buffer_set img.pixels (o + 3) (buffer_get alpha (ao + x))
|
|
1730
|
+
} {
|
|
1731
|
+
buffer_set img.pixels (o + 3) 255
|
|
1732
|
+
}
|
|
1733
|
+
x = x + 1
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
; The decoded frame as RGBA; alpha holds width * height bytes when hasAlpha.
|
|
1738
|
+
fn toRGBA:void (img:ImageBuffer alpha:buffer hasAlpha:boolean) {
|
|
1739
|
+
img.initClear(width height)
|
|
1740
|
+
def lastUV:int (bit_shr (height - 1) 1)
|
|
1741
|
+
def row:int 0
|
|
1742
|
+
while (row < height) {
|
|
1743
|
+
def near:int 0
|
|
1744
|
+
def far:int 0
|
|
1745
|
+
if (row > 0) {
|
|
1746
|
+
if ((bit_and row 1) == 1) {
|
|
1747
|
+
near = (bit_shr (row - 1) 1)
|
|
1748
|
+
far = (bit_shr (row + 1) 1)
|
|
1749
|
+
if (far > lastUV) {
|
|
1750
|
+
far = lastUV
|
|
1751
|
+
}
|
|
1752
|
+
} {
|
|
1753
|
+
near = (bit_shr row 1)
|
|
1754
|
+
far = near - 1
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
this.emitRow(img alpha hasAlpha row near far)
|
|
1758
|
+
row = row + 1
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
; ======================================================================
|
|
1763
|
+
; Constant tables (RFC 6386)
|
|
1764
|
+
; ======================================================================
|
|
1765
|
+
|
|
1766
|
+
sfn dcTable:[int] () {
|
|
1767
|
+
return ([] _:int (
|
|
1768
|
+
4 5 6 7 8 9 10 10 11 12 13 14 15 16 17 17 18 19 20 20 21 21 22 22
|
|
1769
|
+
23 23 24 25 25 26 27 28 29 30 31 32 33 34 35 36 37 37 38 39 40 41 42 43
|
|
1770
|
+
44 45 46 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
|
1771
|
+
67 68 69 70 71 72 73 74 75 76 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
|
1772
|
+
91 93 95 96 98 100 101 102 104 106 108 110 112 114 116 118 122 124 126 128 130 132 134 136
|
|
1773
|
+
138 140 143 145 148 151 154 157
|
|
1774
|
+
))
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
sfn acTable:[int] () {
|
|
1778
|
+
return ([] _:int (
|
|
1779
|
+
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
|
1780
|
+
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
|
1781
|
+
52 53 54 55 56 57 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92
|
|
1782
|
+
94 96 98 100 102 104 106 108 110 112 114 116 119 122 125 128 131 134 137 140 143 146 149 152
|
|
1783
|
+
155 158 161 164 167 170 173 177 181 185 189 193 197 201 205 209 213 217 221 225 229 234 239 245
|
|
1784
|
+
249 254 259 264 269 274 279 284
|
|
1785
|
+
))
|
|
1786
|
+
}
|
|
1787
|
+
|
|
1788
|
+
sfn coeffUpdateProba:[int] () {
|
|
1789
|
+
return ([] _:int (
|
|
1790
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1791
|
+
255 255 255 255 255 255 255 255 255 176 246 255 255 255 255 255 255 255 255 255 223 241 252 255
|
|
1792
|
+
255 255 255 255 255 255 255 249 253 253 255 255 255 255 255 255 255 255 255 244 252 255 255 255
|
|
1793
|
+
255 255 255 255 255 234 254 254 255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255
|
|
1794
|
+
255 255 255 255 246 254 255 255 255 255 255 255 255 255 239 253 254 255 255 255 255 255 255 255
|
|
1795
|
+
255 254 255 254 255 255 255 255 255 255 255 255 255 248 254 255 255 255 255 255 255 255 255 251
|
|
1796
|
+
255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 254
|
|
1797
|
+
255 255 255 255 255 255 255 255 251 254 254 255 255 255 255 255 255 255 255 254 255 254 255 255
|
|
1798
|
+
255 255 255 255 255 255 255 254 253 255 254 255 255 255 255 255 255 250 255 254 255 254 255 255
|
|
1799
|
+
255 255 255 255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1800
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1801
|
+
217 255 255 255 255 255 255 255 255 255 255 225 252 241 253 255 255 254 255 255 255 255 234 250
|
|
1802
|
+
241 250 253 255 253 254 255 255 255 255 254 255 255 255 255 255 255 255 255 255 223 254 254 255
|
|
1803
|
+
255 255 255 255 255 255 255 238 253 254 254 255 255 255 255 255 255 255 255 248 254 255 255 255
|
|
1804
|
+
255 255 255 255 255 249 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1805
|
+
255 255 255 255 253 255 255 255 255 255 255 255 255 255 247 254 255 255 255 255 255 255 255 255
|
|
1806
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 253 254 255 255 255 255 255 255 255 255 252
|
|
1807
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254
|
|
1808
|
+
255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1809
|
+
255 255 255 255 255 255 255 254 253 255 255 255 255 255 255 255 255 250 255 255 255 255 255 255
|
|
1810
|
+
255 255 255 255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1811
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1812
|
+
186 251 250 255 255 255 255 255 255 255 255 234 251 244 254 255 255 255 255 255 255 255 251 251
|
|
1813
|
+
243 253 254 255 254 255 255 255 255 255 253 254 255 255 255 255 255 255 255 255 236 253 254 255
|
|
1814
|
+
255 255 255 255 255 255 255 251 253 253 254 254 255 255 255 255 255 255 255 254 254 255 255 255
|
|
1815
|
+
255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1816
|
+
255 255 255 255 254 255 255 255 255 255 255 255 255 255 254 254 255 255 255 255 255 255 255 255
|
|
1817
|
+
255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254
|
|
1818
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1819
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1820
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1821
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1822
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1823
|
+
248 255 255 255 255 255 255 255 255 255 255 250 254 252 254 255 255 255 255 255 255 255 248 254
|
|
1824
|
+
249 253 255 255 255 255 255 255 255 255 253 253 255 255 255 255 255 255 255 255 246 253 253 255
|
|
1825
|
+
255 255 255 255 255 255 255 252 254 251 254 254 255 255 255 255 255 255 255 254 252 255 255 255
|
|
1826
|
+
255 255 255 255 255 248 254 253 255 255 255 255 255 255 255 255 253 255 254 254 255 255 255 255
|
|
1827
|
+
255 255 255 255 251 254 255 255 255 255 255 255 255 255 245 251 254 255 255 255 255 255 255 255
|
|
1828
|
+
255 253 253 254 255 255 255 255 255 255 255 255 255 251 253 255 255 255 255 255 255 255 255 252
|
|
1829
|
+
253 254 255 255 255 255 255 255 255 255 255 254 255 255 255 255 255 255 255 255 255 255 252 255
|
|
1830
|
+
255 255 255 255 255 255 255 255 249 255 254 255 255 255 255 255 255 255 255 255 255 254 255 255
|
|
1831
|
+
255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255 255 250 255 255 255 255 255 255
|
|
1832
|
+
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1833
|
+
255 255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
|
1834
|
+
))
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1837
|
+
sfn coeffProba0:[int] () {
|
|
1838
|
+
return ([] _:int (
|
|
1839
|
+
128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128
|
|
1840
|
+
128 128 128 128 128 128 128 128 128 253 136 254 255 228 219 128 128 128 128 128 189 129 242 255
|
|
1841
|
+
227 213 255 219 128 128 128 106 126 227 252 214 209 255 255 128 128 128 1 98 248 255 236 226
|
|
1842
|
+
255 255 128 128 128 181 133 238 254 221 234 255 154 128 128 128 78 134 202 247 198 180 255 219
|
|
1843
|
+
128 128 128 1 185 249 255 243 255 128 128 128 128 128 184 150 247 255 236 224 128 128 128 128
|
|
1844
|
+
128 77 110 216 255 236 230 128 128 128 128 128 1 101 251 255 241 255 128 128 128 128 128 170
|
|
1845
|
+
139 241 252 236 209 255 255 128 128 128 37 116 196 243 228 255 255 255 128 128 128 1 204 254
|
|
1846
|
+
255 245 255 128 128 128 128 128 207 160 250 255 238 128 128 128 128 128 128 102 103 231 255 211
|
|
1847
|
+
171 128 128 128 128 128 1 152 252 255 240 255 128 128 128 128 128 177 135 243 255 234 225 128
|
|
1848
|
+
128 128 128 128 80 129 211 255 194 224 128 128 128 128 128 1 1 255 128 128 128 128 128 128
|
|
1849
|
+
128 128 246 1 255 128 128 128 128 128 128 128 128 255 128 128 128 128 128 128 128 128 128 128
|
|
1850
|
+
198 35 237 223 193 187 162 160 145 155 62 131 45 198 221 172 176 220 157 252 221 1 68 47
|
|
1851
|
+
146 208 149 167 221 162 255 223 128 1 149 241 255 221 224 255 255 128 128 128 184 141 234 253
|
|
1852
|
+
222 220 255 199 128 128 128 81 99 181 242 176 190 249 202 255 255 128 1 129 232 253 214 197
|
|
1853
|
+
242 196 255 255 128 99 121 210 250 201 198 255 202 128 128 128 23 91 163 242 170 187 247 210
|
|
1854
|
+
255 255 128 1 200 246 255 234 255 128 128 128 128 128 109 178 241 255 231 245 255 255 128 128
|
|
1855
|
+
128 44 130 201 253 205 192 255 255 128 128 128 1 132 239 251 219 209 255 165 128 128 128 94
|
|
1856
|
+
136 225 251 218 190 255 255 128 128 128 22 100 174 245 186 161 255 199 128 128 128 1 182 249
|
|
1857
|
+
255 232 235 128 128 128 128 128 124 143 241 255 227 234 128 128 128 128 128 35 77 181 251 193
|
|
1858
|
+
211 255 205 128 128 128 1 157 247 255 236 231 255 255 128 128 128 121 141 235 255 225 227 255
|
|
1859
|
+
255 128 128 128 45 99 188 251 195 217 255 224 128 128 128 1 1 251 255 213 255 128 128 128
|
|
1860
|
+
128 128 203 1 248 255 255 128 128 128 128 128 128 137 1 177 255 224 255 128 128 128 128 128
|
|
1861
|
+
253 9 248 251 207 208 255 192 128 128 128 175 13 224 243 193 185 249 198 255 255 128 73 17
|
|
1862
|
+
171 221 161 179 236 167 255 234 128 1 95 247 253 212 183 255 255 128 128 128 239 90 244 250
|
|
1863
|
+
211 209 255 255 128 128 128 155 77 195 248 188 195 255 255 128 128 128 1 24 239 251 218 219
|
|
1864
|
+
255 205 128 128 128 201 51 219 255 196 186 128 128 128 128 128 69 46 190 239 201 218 255 228
|
|
1865
|
+
128 128 128 1 191 251 255 255 128 128 128 128 128 128 223 165 249 255 213 255 128 128 128 128
|
|
1866
|
+
128 141 124 248 255 255 128 128 128 128 128 128 1 16 248 255 255 128 128 128 128 128 128 190
|
|
1867
|
+
36 230 255 236 255 128 128 128 128 128 149 1 255 128 128 128 128 128 128 128 128 1 226 255
|
|
1868
|
+
128 128 128 128 128 128 128 128 247 192 255 128 128 128 128 128 128 128 128 240 128 255 128 128
|
|
1869
|
+
128 128 128 128 128 128 1 134 252 255 255 128 128 128 128 128 128 213 62 250 255 255 128 128
|
|
1870
|
+
128 128 128 128 55 93 255 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128
|
|
1871
|
+
128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128
|
|
1872
|
+
202 24 213 235 186 191 220 160 240 175 255 126 38 182 232 169 184 228 174 255 187 128 61 46
|
|
1873
|
+
138 219 151 178 240 170 255 216 128 1 112 230 250 199 191 247 159 255 255 128 166 109 228 252
|
|
1874
|
+
211 215 255 174 128 128 128 39 77 162 232 172 180 245 178 255 255 128 1 52 220 246 198 199
|
|
1875
|
+
249 220 255 255 128 124 74 191 243 183 193 250 221 255 255 128 24 71 130 219 154 170 243 182
|
|
1876
|
+
255 255 128 1 182 225 249 219 240 255 224 128 128 128 149 150 226 252 216 205 255 171 128 128
|
|
1877
|
+
128 28 108 170 242 183 194 254 223 255 255 128 1 81 230 252 204 203 255 192 128 128 128 123
|
|
1878
|
+
102 209 247 188 196 255 233 128 128 128 20 95 153 243 164 173 255 203 128 128 128 1 222 248
|
|
1879
|
+
255 216 213 128 128 128 128 128 168 175 246 252 235 205 255 255 128 128 128 47 116 215 255 211
|
|
1880
|
+
212 255 255 128 128 128 1 121 236 253 212 214 255 255 128 128 128 141 84 213 252 201 202 255
|
|
1881
|
+
219 128 128 128 42 80 160 240 162 185 255 205 128 128 128 1 1 255 128 128 128 128 128 128
|
|
1882
|
+
128 128 244 1 255 128 128 128 128 128 128 128 128 238 1 255 128 128 128 128 128 128 128 128
|
|
1883
|
+
))
|
|
1884
|
+
}
|
|
1885
|
+
|
|
1886
|
+
sfn modesProba:[int] () {
|
|
1887
|
+
return ([] _:int (
|
|
1888
|
+
231 120 48 89 115 113 120 152 112 152 179 64 126 170 118 46 70 95 175 69 143 80 85 82
|
|
1889
|
+
72 155 103 56 58 10 171 218 189 17 13 152 114 26 17 163 44 195 21 10 173 121 24 80
|
|
1890
|
+
195 26 62 44 64 85 144 71 10 38 171 213 144 34 26 170 46 55 19 136 160 33 206 71
|
|
1891
|
+
63 20 8 114 114 208 12 9 226 81 40 11 96 182 84 29 16 36 134 183 89 137 98 101
|
|
1892
|
+
106 165 148 72 187 100 130 157 111 32 75 80 66 102 167 99 74 62 40 234 128 41 53 9
|
|
1893
|
+
178 241 141 26 8 107 74 43 26 146 73 166 49 23 157 65 38 105 160 51 52 31 115 128
|
|
1894
|
+
104 79 12 27 217 255 87 17 7 87 68 71 44 114 51 15 186 23 47 41 14 110 182 183
|
|
1895
|
+
21 17 194 66 45 25 102 197 189 23 18 22 88 88 147 150 42 46 45 196 205 43 97 183
|
|
1896
|
+
117 85 38 35 179 61 39 53 200 87 26 21 43 232 171 56 34 51 104 114 102 29 93 77
|
|
1897
|
+
39 28 85 171 58 165 90 98 64 34 22 116 206 23 34 43 166 73 107 54 32 26 51 1
|
|
1898
|
+
81 43 31 68 25 106 22 64 171 36 225 114 34 19 21 102 132 188 16 76 124 62 18 78
|
|
1899
|
+
95 85 57 50 48 51 193 101 35 159 215 111 89 46 111 60 148 31 172 219 228 21 18 111
|
|
1900
|
+
112 113 77 85 179 255 38 120 114 40 42 1 196 245 209 10 25 109 88 43 29 140 166 213
|
|
1901
|
+
37 43 154 61 63 30 155 67 45 68 1 209 100 80 8 43 154 1 51 26 71 142 78 78
|
|
1902
|
+
16 255 128 34 197 171 41 40 5 102 211 183 4 1 221 51 50 17 168 209 192 23 25 82
|
|
1903
|
+
138 31 36 171 27 166 38 44 229 67 87 58 169 82 115 26 59 179 63 59 90 180 59 166
|
|
1904
|
+
93 73 154 40 40 21 116 143 209 34 39 175 47 15 16 183 34 223 49 45 183 46 17 33
|
|
1905
|
+
183 6 98 15 32 183 57 46 22 24 128 1 54 17 37 65 32 73 115 28 128 23 128 205
|
|
1906
|
+
40 3 9 115 51 192 18 6 223 87 37 9 115 59 77 64 21 47 104 55 44 218 9 54
|
|
1907
|
+
53 130 226 64 90 70 205 40 41 23 26 57 54 57 112 184 5 41 38 166 213 30 34 26
|
|
1908
|
+
133 152 116 10 32 134 39 19 53 221 26 114 32 73 255 31 9 65 234 2 15 1 118 73
|
|
1909
|
+
75 32 12 51 192 255 160 43 51 88 31 35 67 102 85 55 186 85 56 21 23 111 59 205
|
|
1910
|
+
45 37 192 55 38 70 124 73 102 1 34 98 125 98 42 88 104 85 117 175 82 95 84 53
|
|
1911
|
+
89 128 100 113 101 45 75 79 123 47 51 128 81 171 1 57 17 5 71 102 57 53 41 49
|
|
1912
|
+
38 33 13 121 57 73 26 1 85 41 10 67 138 77 110 90 47 114 115 21 2 10 102 255
|
|
1913
|
+
166 23 6 101 29 16 10 85 128 101 196 26 57 18 10 102 102 213 34 20 43 117 20 15
|
|
1914
|
+
36 163 128 68 1 26 102 61 71 37 34 53 31 243 192 69 60 71 38 73 119 28 222 37
|
|
1915
|
+
68 45 128 34 1 47 11 245 171 62 17 19 70 146 85 55 62 70 37 43 37 154 100 163
|
|
1916
|
+
85 160 1 63 9 92 136 28 64 32 201 85 75 15 9 9 64 255 184 119 16 86 6 28
|
|
1917
|
+
5 64 255 25 248 1 56 8 17 132 137 255 55 116 128 58 15 20 82 135 57 26 121 40
|
|
1918
|
+
164 50 31 137 154 133 25 35 218 51 103 44 131 131 123 31 6 158 86 40 64 135 148 224
|
|
1919
|
+
45 183 128 22 26 17 131 240 154 14 1 209 45 16 21 91 64 222 7 1 197 56 21 39
|
|
1920
|
+
155 60 138 23 102 213 83 12 13 54 192 255 68 47 28 85 26 85 85 128 128 32 146 171
|
|
1921
|
+
18 11 7 63 144 171 4 4 246 35 27 10 146 174 171 12 26 128 190 80 35 99 180 80
|
|
1922
|
+
126 54 45 85 126 47 87 176 51 41 20 32 101 75 128 139 118 146 116 128 85 56 41 15
|
|
1923
|
+
176 236 85 37 9 62 71 30 17 119 118 255 17 18 138 101 38 60 138 55 70 43 26 142
|
|
1924
|
+
146 36 19 30 171 255 97 27 20 138 45 61 62 219 1 81 188 64 32 41 20 117 151 142
|
|
1925
|
+
20 21 163 112 19 12 61 195 128 48 4 24
|
|
1926
|
+
))
|
|
1927
|
+
}
|
|
1928
|
+
|
|
1929
|
+
}
|