ref: 1e34aeb5776d6061fc6bd206466a0d87947c5de4
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Apr 25 15:25:52 EDT 2023
💩
--- /dev/null
+++ b/cabac.c
@@ -1,0 +1,453 @@
+/* See ITU-T Rec. H.264: 9.3.1.1 */
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+/* {m, n}: only values relevant to I-slices, the rest is {0, 0} */
+static u8int mn[460][2] = {
+ /* 9-12 */
+ {20, -15}, {2, 54}, {3, 74}, {20, -15}, {2, 54},
+ {3, 74}, {-28, 127}, {-23, 104}, {-6, 53}, {-1, 54},
+ {7, 51},
+
+ /* 9-13 */
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
+ {0, 0}, {0, 0}, {0, 0},
+
+ /* 9-14 */
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
+ {0, 0},
+
+ /* 9-15 */
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
+ {0, 0}, {0, 0}, {0, 0}, {0, 0},
+
+ /* 9-16 (54 to 59) */
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
+ {0, 0},
+
+ /* 9-17 */
+ {0, 41}, {0, 63}, {0, 63}, {0, 63}, {-9, 83},
+ {4, 86}, {0, 97}, {-7, 72}, {13, 41}, {3, 62},
+
+ /* 9-18 */
+ {0, 11}, {1, 55}, {0, 69}, {-17, 127}, {-13, 102},
+ {0, 82}, {-7, 74}, {-21, 107}, {-27, 127}, {-31, 127},
+ {-24, 127}, {-18, 95}, {-27, 127}, {-21, 114}, {-30, 127},
+ {-17, 123}, {-12, 115}, {-16, 122}, {-11, 115}, {-12, 63},
+ {-2, 68}, {-15, 84}, {-13, 104}, {-3, 70}, {-8, 93},
+ {-10, 90}, {-30, 127}, {-1, 74}, {-6, 97}, {-7, 91},
+ {-20, 127}, {-4, 56}, {-5, 82}, {-7, 76}, {-22, 125},
+
+ /* 9-19 */
+ {-7, 93}, {-11, 87}, {-3, 77}, {-5, 71}, {-4, 63},
+ {-4, 68}, {-12, 84}, {-7, 62}, {-7, 65}, {8, 61},
+ {5, 56}, {-2, 66}, {1, 64}, {0, 61}, {-2, 78},
+ {1, 50}, {7, 52}, {10, 35}, {0, 44}, {11, 38},
+ {1, 45}, {0, 46}, {5, 44}, {31, 17}, {1, 51},
+ {7, 50}, {28, 19}, {16, 33}, {14, 62}, {-13, 108},
+ {-15, 100}, {-13, 101}, {-13, 91}, {-12, 94}, {-10, 88},
+ {-16, 84}, {-10, 86}, {-7, 83}, {-13, 87}, {-19, 94},
+ {1, 70}, {0, 72}, {-5, 74}, {18, 59}, {-8, 102},
+ {-15, 100}, {0, 95}, {-4, 75}, {2, 72}, {-11, 75},
+ {-3, 71}, {15, 46}, {-13, 69}, {0, 62}, {0, 65},
+ {21, 37}, {-15, 72}, {9, 57}, {16, 54}, {0, 62},
+ {12, 72},
+
+ /* 9-20 */
+ {24, 0}, {15, 9}, {8, 25}, {13, 18}, {15, 9},
+ {13, 19}, {10, 37}, {12, 18}, {6, 29}, {20, 33},
+ {15, 30}, {4, 45}, {1, 58}, {0, 62}, {7, 61},
+ {12, 38}, {11, 45}, {15, 39}, {11, 42}, {13, 44},
+ {16, 45}, {12, 41}, {10, 49}, {30, 34}, {18, 42},
+ {10, 55}, {17, 51}, {17, 46}, {0, 89}, {26, -19},
+ {22, -17}, {26, -17}, {30, -25}, {28, -20}, {33, -23},
+ {37, -27}, {33, -23}, {40, -28}, {38, -17}, {33, -11},
+ {40, -15}, {41, -6}, {38, 1}, {41, 17}, {30, -6},
+ {27, 3}, {26, 22}, {37, -16}, {35, -4}, {38, -8},
+ {38, -3}, {37, 3}, {38, 5}, {42, 0}, {35, 16},
+ {39, 22}, {14, 48}, {27, 37}, {21, 60}, {12, 68},
+ {2, 97},
+
+ /* 9-21 */
+ {-3, 71}, {-6, 42}, {-5, 50}, {-3, 54}, {-2, 62},
+ {0, 58}, {1, 63}, {-2, 72}, {-1, 74}, {-9, 91},
+ {-5, 67}, {-5, 27}, {-3, 39}, {-2, 44}, {0, 46},
+ {-16, 64}, {-8, 68}, {-10, 78}, {-6, 77}, {-10, 86},
+ {-12, 92}, {-15, 55}, {-10, 60}, {-6, 62}, {-4, 65},
+ {-12, 73}, {-8, 76}, {-7, 80}, {-9, 88}, {-17, 110},
+ {-11, 97}, {-20, 84}, {-11, 79}, {-6, 73}, {-4, 74},
+ {-13, 86}, {-13, 96}, {-11, 97}, {-19, 117}, {-8, 78},
+ {-5, 33}, {-4, 48}, {-2, 53}, {-3, 62}, {-13, 71},
+ {-10, 79}, {-12, 86}, {-13, 90}, {-14, 97},
+
+ /* [276] */
+ {0, 0},
+
+ /* 9-22 */
+ {-6, 93}, {-6, 84}, {-8, 79}, {0, 66}, {-1, 71},
+ {0, 62}, {-2, 60}, {-2, 59}, {-5, 75}, {-3, 62},
+ {-4, 58}, {-9, 66}, {-1, 79}, {0, 71}, {3, 68},
+ {10, 44}, {-7, 62}, {15, 36}, {14, 40}, {16, 27},
+ {12, 29}, {1, 44}, {20, 36}, {18, 32}, {5, 42},
+ {1, 48}, {10, 62}, {17, 46}, {9, 64}, {-12, 104},
+ {-11, 97}, {-16, 96}, {-7, 88}, {-8, 85}, {-7, 85},
+ {-9, 85}, {-13, 88}, {4, 66}, {-3, 77}, {-3, 76},
+ {-6, 76}, {10, 58}, {-1, 76}, {-1, 83}, {-7, 99},
+ {-14, 95}, {2, 95}, {0, 76}, {-5, 74}, {0, 70},
+ {-11, 75}, {1, 68}, {0, 65}, {-14, 73}, {3, 62},
+ {4, 62}, {-1, 68}, {-13, 75}, {11, 55}, {5, 64},
+ {12, 70},
+
+ /* 9-23 */
+ {15, 6}, {6, 19}, {7, 16}, {12, 14}, {18, 13},
+ {13, 11}, {13, 15}, {15, 16}, {12, 23}, {13, 23},
+ {15, 20}, {14, 26}, {14, 44}, {17, 40}, {17, 47},
+ {24, 17}, {21, 21}, {25, 22}, {31, 27}, {22, 29},
+ {19, 35}, {14, 50}, {10, 57}, {7, 63}, {-2, 77},
+ {-4, 82}, {-3, 94}, {9, 69}, {-12, 109}, {36, -35},
+ {36, -34}, {32, -26}, {37, -30}, {44, -32}, {34, -18},
+ {34, -15}, {40, -15}, {33, -7}, {35, -5}, {33, 0},
+ {38, 2}, {33, 13}, {23, 35}, {13, 58}, {29, -3},
+ {26, 0}, {22, 30}, {31, -7}, {35, -15}, {34, -3},
+ {34, 3}, {36, -1}, {34, 5}, {32, 11}, {35, 5},
+ {34, 12}, {39, 11}, {30, 29}, {34, 26}, {29, 39},
+ {19, 66},
+
+ /* 9-16 (yes, it has values for ctxIdx = 399 to 401) */
+ {31, 21}, {31, 31}, {25, 50},
+
+ /* 9-24 */
+ {-17, 120}, {-20, 112}, {-18, 114}, {-11, 85}, {-15, 92},
+ {-14, 89}, {-26, 71}, {-15, 81}, {-14, 80}, {0, 68},
+ {-14, 70}, {-24, 56}, {-23, 68}, {-24, 50}, {-11, 74},
+ {23, -13}, {26, -13}, {40, -15}, {49, -14}, {44, 3},
+ {45, 6}, {44, 34}, {33, 54}, {19, 82}, {-3, 75},
+ {-1, 23}, {1, 34}, {1, 43}, {0, 54}, {-2, 55},
+ {0, 61}, {1, 64}, {0, 68}, {-9, 92}, {-14, 106},
+ {-13, 97}, {-15, 90}, {-12, 90}, {-18, 88}, {-10, 73},
+ {-9, 79}, {-14, 86}, {-10, 73}, {-10, 70}, {-10, 69},
+ {-5, 66}, {-9, 64}, {-5, 58}, {2, 59}, {21, -10},
+ {24, -11}, {28, -8}, {28, -1}, {29, 3}, {29, 9},
+ {35, 20}, {29, 36}, {14, 67},
+};
+
+typedef struct {
+ int start; /* first ctxIdx to replace */
+ int end; /* last ctxIdx to replace */
+ u8int mn[3][31][2]; /* [cabac_init_idc][start+ctxIdx] = {m, n} */
+}mncii;
+
+/* replacement {m, n} values for cabac_init_idc = [0, 1, 2] */
+static mncii mn_cabac_init_idc[] = {
+ {11, 23, { /* 9-13 */
+ {{23, 33}, {23, 2}, {21, 0}, {1, 9}, {0, 49}, {-37, 118},
+ {5, 57}, {-13, 78}, {-11, 65}, {1, 62}, {12, 49}, {-4, 73},
+ {17, 50}},
+ {{22, 25}, {34, 0}, {16, 0}, {-2, 9}, {4, 41}, {-29, 118},
+ {2, 65}, {-6, 71}, {-13, 79}, {5, 52}, {9, 50}, {-3, 70},
+ {10, 54}},
+ {{29, 16}, {25, 0}, {14, 0}, {-10, 51}, {-3, 62}, {-27, 99},
+ {26, 16}, {-4, 85}, {-24, 102}, {5, 57}, {6, 57}, {-17, 73},
+ {14, 57}}}},
+
+ {24, 39, { /* 9-14 */
+ {{18, 64}, {9, 43}, {29, 0}, {26, 67}, {16, 90}, {9, 104},
+ {-46, 127}, {-20, 104}, {1, 67}, {-13, 78}, {-11, 65}, {1, 62},
+ {-6, 86}, {-17, 95}, {-6, 61}, {9, 45}},
+ {{26, 34}, {19, 22}, {40, 0}, {57, 2}, {41, 36}, {26, 69},
+ {-45, 127}, {-15, 101}, {-4, 76}, {-6, 71}, {-13, 79}, {5, 52},
+ {6, 69}, {-13, 90}, {0, 52}, {8, 43}},
+ {{20, 40}, {20, 10}, {29, 0}, {54, 0}, {37, 42}, {12, 97},
+ {-32, 127}, {-22, 117}, {-2, 74}, {-4, 85}, {-24, 102}, {5, 57},
+ {-6, 93}, {-14, 88}, {-6, 44}, {4, 55}}}},
+
+ {40, 53, { /* 9-15 */
+ {{-3, 69}, {-6, 81}, {-11, 96}, {6, 55}, {7, 67}, {-5, 86},
+ {2, 88}, {0, 58}, {-3, 76}, {-10, 94}, {5, 54}, {4, 69},
+ {-3, 81}, {0, 88}},
+ {{-2, 69}, {-5, 82}, {-10, 96}, {2, 59}, {2, 75}, {-3, 87},
+ {-3, 100}, {1, 56}, {-3, 74}, {-6, 85}, {0, 59}, {-3, 81},
+ {-7, 86}, {-5, 95}},
+ {{-11, 89}, {-15, 103}, {-21, 116}, {19, 57}, {20, 58}, {4, 84},
+ {6, 96}, {1, 63}, {-5, 85}, {-13, 106}, {5, 63}, {6, 75},
+ {-3, 90}, {-1, 101}}}},
+
+ {54, 59, { /* 9-16 */
+ {{-7, 67}, {-5, 74}, {-4, 74}, {-5, 80}, {-7, 72}, {1, 58}},
+ {{-1, 66}, {-1, 77}, {1, 70}, {-2, 86}, {-5, 72}, {0, 61}},
+ {{3, 55}, {-4, 79}, {-2, 75}, {-12, 97}, {-7, 50}, {1, 60}}}},
+
+ {399, 401, { /* 9-16 */
+ {{12, 40}, {11, 51}, {14, 59}},
+ {{25, 32}, {21, 49}, {21, 54}},
+ {{21, 33}, {19, 50}, {17, 61}}}},
+
+ {70, 87, { /* 9-18 */
+ {{0, 45}, {-4, 78}, {-3, 96}, {-27, 126}, {-28, 98}, {-25, 101},
+ {-23, 67}, {-28, 82}, {-20, 94}, {-16, 83}, {-22, 110}, {-21, 91},
+ {-18, 102}, {-13, 93}, {-29, 127}, {-7, 92}, {-5, 89}, {-7, 96}},
+ {{13, 15}, {7, 51}, {2, 80}, {-39, 127}, {-18, 91}, {-17, 96},
+ {-26, 81}, {-35, 98}, {-24, 102}, {-23, 97}, {-27, 119}, {-24, 99},
+ {-21, 110}, {-18, 102}, {-36, 127}, {0, 80}, {-5, 89}, {-7, 94}},
+ {{7, 34}, {-9, 88}, {-20, 127}, {-36, 127}, {-17, 91}, {-14, 95},
+ {-25, 84}, {-25, 86}, {-12, 89}, {-17, 91}, {-31, 127}, {-14, 76},
+ {-18, 103}, {-13, 90}, {-37, 127}, {11, 80}, {5, 76}, {2, 84}}}},
+
+ {88, 104, { /* 9-18 */
+ {{-13, 108}, {-3, 46}, {-1, 65}, {-1, 57}, {-9, 93}, {-3, 74},
+ {-9, 92}, {-8, 87}, {-23, 126}, {5, 54}, {6, 60}, {6, 59},
+ {6, 69}, {-1, 48}, {0, 68}, {-4, 69}, {-8, 88}},
+ {{-4, 92}, {0, 39}, {0, 65}, {-15, 84}, {-35, 127}, {-2, 73},
+ {-12, 104}, {-9, 91}, {-31, 127}, {3, 55}, {7, 56}, {7, 55},
+ {8, 61}, {-3, 53}, {0, 68}, {-7, 74}, {-9, 88}},
+ {{5, 78}, {-6, 55}, {4, 61}, {-14, 83}, {-37, 127}, {-5, 79},
+ {-11, 104}, {-11, 91}, {-30, 127}, {0, 65}, {-2, 79}, {0, 72},
+ {-4, 92}, {-6, 56}, {3, 68}, {-8, 71}, {-13, 98}}}},
+
+ {105, 135, { /* 9-19 */
+ {{-2, 85}, {-6, 78}, {-1, 75}, {-7, 77}, {2, 54}, {5, 50},
+ {-3, 68}, {1, 50}, {6, 42}, {-4, 81}, {1, 63}, {-4, 70},
+ {0, 67}, {2, 57}, {-2, 76}, {11, 35}, {4, 64}, {1, 61},
+ {11, 35}, {18, 25}, {12, 24}, {13, 29}, {13, 36}, {-10, 93},
+ {-7, 73}, {-2, 73}, {13, 46}, {9, 49}, {-7, 100}, {9, 53},
+ {2, 53}},
+ {{-13, 103}, {-13, 91}, {-9, 89}, {-14, 92}, {-8, 76}, {-12, 87},
+ {-23, 110}, {-24, 105}, {-10, 78}, {-20, 112}, {-17, 99}, {-78, 127},
+ {-70, 127}, {-50, 127}, {-46, 127}, {-4, 66}, {-5, 78}, {-4, 71},
+ {-8, 72}, {2, 59}, {-1, 55}, {-7, 70}, {-6, 75}, {-8, 89},
+ {-34, 119}, {-3, 75}, {32, 20}, {30, 22}, {-44, 127}, {0, 54},
+ {-5, 61}},
+ {{-4, 86}, {-12, 88}, {-5, 82}, {-3, 72}, {-4, 67}, {-8, 72},
+ {-16, 89}, {-9, 69}, {-1, 59}, {5, 66}, {4, 57}, {-4, 71},
+ {-2, 71}, {2, 58}, {-1, 74}, {-4, 44}, {-1, 69}, {0, 62},
+ {-7, 51}, {-4, 47}, {-6, 42}, {-3, 41}, {-6, 53}, {8, 76},
+ {-9, 78}, {-11, 83}, {9, 52}, {0, 67}, {-5, 90}, {1, 67},
+ {-15, 72}}}},
+
+ {136, 165, { /* 9-19 */
+ {{5, 53}, {-2, 61}, {0, 56}, {0, 56}, {-13, 63}, {-5, 60},
+ {-1, 62}, {4, 57}, {-6, 69}, {4, 57}, {14, 39}, {4, 51},
+ {13, 68}, {3, 64}, {1, 61}, {9, 63}, {7, 50}, {16, 39},
+ {5, 44}, {4, 52}, {11, 48}, {-5, 60}, {-1, 59}, {0, 59},
+ {22, 33}, {5, 44}, {14, 43}, {-1, 78}, {0, 60}, {9, 69}},
+ {{0, 58}, {-1, 60}, {-3, 61}, {-8, 67}, {-25, 84}, {-14, 74},
+ {-5, 65}, {5, 52}, {2, 57}, {0, 61}, {-9, 69}, {-11, 70},
+ {18, 55}, {-4, 71}, {0, 58}, {7, 61}, {9, 41}, {18, 25},
+ {9, 32}, {5, 43}, {9, 47}, {0, 44}, {0, 51}, {2, 46},
+ {19, 38}, {-4, 66}, {15, 38}, {12, 42}, {9, 34}, {0, 89}},
+ {{-5, 75}, {-8, 80}, {-21, 83}, {-21, 64}, {-13, 31}, {-25, 64},
+ {-29, 94}, {9, 75}, {17, 63}, {-8, 74}, {-5, 35}, {-2, 27},
+ {13, 91}, {3, 65}, {-7, 69}, {8, 77}, {-10, 66}, {3, 62},
+ {-3, 68}, {-20, 81}, {0, 30}, {1, 7}, {-3, 23}, {-21, 74},
+ {16, 66}, {-23, 124}, {17, 37}, {44, -18}, {50, -34}, {-22, 127}}}},
+
+ {166, 196, { /* 9-20 */
+ {{11, 28}, {2, 40}, {3, 44}, {0, 49}, {0, 46}, {2, 44},
+ {2, 51}, {0, 47}, {4, 39}, {2, 62}, {6, 46}, {0, 54},
+ {3, 54}, {2, 58}, {4, 63}, {6, 51}, {6, 57}, {7, 53},
+ {6, 52}, {6, 55}, {11, 45}, {14, 36}, {8, 53}, {-1, 82},
+ {7, 55}, {-3, 78}, {15, 46}, {22, 31}, {-1, 84}, {25, 7},
+ {30, -7}},
+ {{4, 45}, {10, 28}, {10, 31}, {33, -11}, {52, -43}, {18, 15},
+ {28, 0}, {35, -22}, {38, -25}, {34, 0}, {39, -18}, {32, -12},
+ {102, -94}, {0, 0}, {56, -15}, {33, -4}, {29, 10}, {37, -5},
+ {51, -29}, {39, -9}, {52, -34}, {69, -58}, {67, -63}, {44, -5},
+ {32, 7}, {55, -29}, {32, 1}, {0, 0}, {27, 36}, {33, -25},
+ {34, -30}},
+ {{4, 39}, {0, 42}, {7, 34}, {11, 29}, {8, 31}, {6, 37},
+ {7, 42}, {3, 40}, {8, 33}, {13, 43}, {13, 36}, {4, 47},
+ {3, 55}, {2, 58}, {6, 60}, {8, 44}, {11, 44}, {14, 42},
+ {7, 48}, {4, 56}, {4, 52}, {13, 37}, {9, 49}, {19, 58},
+ {10, 48}, {12, 45}, {0, 69}, {20, 33}, {8, 63}, {35, -18},
+ {33, -25}}}},
+
+ {197, 226, { /* 9-20 */
+ {{28, 3}, {28, 4}, {32, 0}, {34, -1}, {30, 6}, {30, 6},
+ {32, 9}, {31, 19}, {26, 27}, {26, 30}, {37, 20}, {28, 34},
+ {17, 70}, {1, 67}, {5, 59}, {9, 67}, {16, 30}, {18, 32},
+ {18, 35}, {22, 29}, {24, 31}, {23, 38}, {18, 43}, {20, 41},
+ {11, 63}, {9, 59}, {9, 64}, {-1, 94}, {-2, 89}, {-9, 108}},
+ {{36, -28}, {38, -28}, {38, -27}, {34, -18}, {35, -16}, {34, -14},
+ {32, -8}, {37, -6}, {35, 0}, {30, 10}, {28, 18}, {26, 25},
+ {29, 41}, {0, 75}, {2, 72}, {8, 77}, {14, 35}, {18, 31},
+ {17, 35}, {21, 30}, {17, 45}, {20, 42}, {18, 45}, {27, 26},
+ {16, 54}, {7, 66}, {16, 56}, {11, 73}, {10, 67}, {-10, 116}},
+ {{28, -3}, {24, 10}, {27, 0}, {34, -14}, {52, -44}, {39, -24},
+ {19, 17}, {31, 25}, {36, 29}, {24, 33}, {34, 15}, {30, 20},
+ {22, 73}, {20, 34}, {19, 31}, {27, 44}, {19, 16}, {15, 36},
+ {15, 36}, {21, 28}, {25, 21}, {30, 20}, {31, 12}, {27, 16},
+ {24, 42}, {0, 93}, {14, 56}, {15, 57}, {26, 38}, {-24, 127}}}},
+
+ {227, 251, { /* 9-21 */
+ {{-6, 76}, {-2, 44}, {0, 45}, {0, 52}, {-3, 64}, {-2, 59},
+ {-4, 70}, {-4, 75}, {-8, 82}, {-17, 102}, {-9, 77}, {3, 24},
+ {0, 42}, {0, 48}, {0, 55}, {-6, 59}, {-7, 71}, {-12, 83},
+ {-11, 87}, {-30, 119}, {1, 58}, {-3, 29}, {-1, 36}, {1, 38},
+ {2, 43}},
+ {{-23, 112}, {-15, 71}, {-7, 61}, {0, 53}, {-5, 66}, {-11, 77},
+ {-9, 80}, {-9, 84}, {-10, 87}, {-34, 127}, {-21, 101}, {-3, 39},
+ {-5, 53}, {-7, 61}, {-11, 75}, {-15, 77}, {-17, 91}, {-25, 107},
+ {-25, 111}, {-28, 122}, {-11, 76}, {-10, 44}, {-10, 52}, {-10, 57},
+ {-9, 58}},
+ {{-24, 115}, {-22, 82}, {-9, 62}, {0, 53}, {0, 59}, {-14, 85},
+ {-13, 89}, {-13, 94}, {-11, 92}, {-29, 127}, {-21, 100}, {-14, 57},
+ {-12, 67}, {-11, 71}, {-10, 77}, {-21, 85}, {-16, 88}, {-23, 104},
+ {-15, 98}, {-37, 127}, {-10, 82}, {-8, 48}, {-8, 61}, {-8, 66},
+ {-7, 70}}}},
+
+ {252, 275, { /* 9-21 */
+ {{-6, 55}, {0, 58}, {0, 64}, {-3, 74}, {-10, 90}, {0, 70},
+ {-4, 29}, {5, 31}, {7, 42}, {1, 59}, {-2, 58}, {-3, 72},
+ {-3, 81}, {-11, 97}, {0, 58}, {8, 5}, {10, 14}, {14, 18},
+ {13, 27}, {2, 40}, {0, 58}, {-3, 70}, {-6, 79}, {-8, 85}},
+ {{-16, 72}, {-7, 69}, {-4, 69}, {-5, 74}, {-9, 86}, {2, 66},
+ {-9, 34}, {1, 32}, {11, 31}, {5, 52}, {-2, 55}, {-2, 67},
+ {0, 73}, {-8, 89}, {3, 52}, {7, 4}, {10, 8}, {17, 8},
+ {16, 19}, {3, 37}, {-1, 61}, {-5, 73}, {-1, 70}, {-4, 78}},
+ {{-14, 75}, {-10, 79}, {-9, 83}, {-12, 92}, {-18, 108}, {-4, 79},
+ {-22, 69}, {-16, 75}, {-2, 58}, {1, 58}, {-13, 78}, {-9, 83},
+ {-4, 81}, {-13, 99}, {-13, 81}, {-6, 38}, {-13, 62}, {-6, 58},
+ {-2, 59}, {-16, 73}, {-10, 76}, {-13, 86}, {-9, 83}, {-10, 87}}}},
+
+ {277, 307, { /* 9-22 */
+ {{-13, 106}, {-16, 106}, {-10, 87}, {-21, 114}, {-18, 110}, {-14, 98},
+ {-22, 110}, {-21, 106}, {-18, 103}, {-21, 107}, {-23, 108}, {-26, 112},
+ {-10, 96}, {-12, 95}, {-5, 91}, {-9, 93}, {-22, 94}, {-5, 86},
+ {9, 67}, {-4, 80}, {-10, 85}, {-1, 70}, {7, 60}, {9, 58},
+ {5, 61}, {12, 50}, {15, 50}, {18, 49}, {17, 54}, {10, 41},
+ {7, 46}},
+ {{-21, 126}, {-23, 124}, {-20, 110}, {-26, 126}, {-25, 124}, {-17, 105},
+ {-27, 121}, {-27, 117}, {-17, 102}, {-26, 117}, {-27, 116}, {-33, 122},
+ {-10, 95}, {-14, 100}, {-8, 95}, {-17, 111}, {-28, 114}, {-6, 89},
+ {-2, 80}, {-4, 82}, {-9, 85}, {-8, 81}, {-1, 72}, {5, 64},
+ {1, 67}, {9, 56}, {0, 69}, {1, 69}, {7, 69}, {-7, 69},
+ {-6, 67}},
+ {{-22, 127}, {-25, 127}, {-25, 120}, {-27, 127}, {-19, 114}, {-23, 117},
+ {-25, 118}, {-26, 117}, {-24, 113}, {-28, 118}, {-31, 120}, {-37, 124},
+ {-10, 94}, {-15, 102}, {-10, 99}, {-13, 106}, {-50, 127}, {-5, 92},
+ {17, 57}, {-5, 86}, {-13, 94}, {-12, 91}, {-2, 77}, {0, 71},
+ {-1, 73}, {4, 64}, {-7, 81}, {5, 64}, {15, 57}, {1, 67},
+ {0, 68}}}},
+
+ {308, 337, { /* 9-22 */
+ {{-1, 51}, {7, 49}, {8, 52}, {9, 41}, {6, 47}, {2, 55},
+ {13, 41}, {10, 44}, {6, 50}, {5, 53}, {13, 49}, {4, 63},
+ {6, 64}, {-2, 69}, {-2, 59}, {6, 70}, {10, 44}, {9, 31},
+ {12, 43}, {3, 53}, {14, 34}, {10, 38}, {-3, 52}, {13, 40},
+ {17, 32}, {7, 44}, {7, 38}, {13, 50}, {10, 57}, {26, 43}},
+ {{-16, 77}, {-2, 64}, {2, 61}, {-6, 67}, {-3, 64}, {2, 57},
+ {-3, 65}, {-3, 66}, {0, 62}, {9, 51}, {-1, 66}, {-2, 71},
+ {-2, 75}, {-1, 70}, {-9, 72}, {14, 60}, {16, 37}, {0, 47},
+ {18, 35}, {11, 37}, {12, 41}, {10, 41}, {2, 48}, {12, 41},
+ {13, 41}, {0, 59}, {3, 50}, {19, 40}, {3, 66}, {18, 50}},
+ {{-10, 67}, {1, 68}, {0, 77}, {2, 64}, {0, 68}, {-5, 78},
+ {7, 55}, {5, 59}, {2, 65}, {14, 54}, {15, 44}, {5, 60},
+ {2, 70}, {-2, 76}, {-18, 86}, {12, 70}, {5, 64}, {-12, 70},
+ {11, 55}, {5, 56}, {0, 69}, {2, 65}, {-6, 74}, {5, 54},
+ {7, 54}, {-6, 76}, {-11, 82}, {-2, 77}, {-2, 77}, {25, 42}}}},
+
+ {338, 368, { /* 9-23 */
+ {{14, 11}, {11, 14}, {9, 11}, {18, 11}, {21, 9}, {23, -2},
+ {32, -15}, {32, -15}, {34, -21}, {39, -23}, {42, -33}, {41, -31},
+ {46, -28}, {38, -12}, {21, 29}, {45, -24}, {53, -45}, {48, -26},
+ {65, -43}, {43, -19}, {39, -10}, {30, 9}, {18, 26}, {20, 27},
+ {0, 57}, {-14, 82}, {-5, 75}, {-19, 97}, {-35, 125}, {27, 0},
+ {28, 0}},
+ {{19, -6}, {18, -6}, {14, 0}, {26, -12}, {31, -16}, {33, -25},
+ {33, -22}, {37, -28}, {39, -30}, {42, -30}, {47, -42}, {45, -36},
+ {49, -34}, {41, -17}, {32, 9}, {69, -71}, {63, -63}, {66, -64},
+ {77, -74}, {54, -39}, {52, -35}, {41, -10}, {36, 0}, {40, -1},
+ {30, 14}, {28, 26}, {23, 37}, {12, 55}, {11, 65}, {37, -33},
+ {39, -36}},
+ {{17, -13}, {16, -9}, {17, -12}, {27, -21}, {37, -30}, {41, -40},
+ {42, -41}, {48, -47}, {39, -32}, {46, -40}, {52, -51}, {46, -41},
+ {52, -39}, {43, -19}, {32, 11}, {61, -55}, {56, -46}, {62, -50},
+ {81, -67}, {45, -20}, {35, -2}, {28, 15}, {34, 1}, {39, 1},
+ {30, 17}, {20, 38}, {18, 45}, {15, 54}, {0, 79}, {36, -16},
+ {37, -14}}}},
+
+ {369, 398, { /* 9-23 */
+ {{31, -4}, {27, 6}, {34, 8}, {30, 10}, {24, 22}, {33, 19},
+ {22, 32}, {26, 31}, {21, 41}, {26, 44}, {23, 47}, {16, 65},
+ {14, 71}, {8, 60}, {6, 63}, {17, 65}, {21, 24}, {23, 20},
+ {26, 23}, {27, 32}, {28, 23}, {28, 24}, {23, 40}, {24, 32},
+ {28, 29}, {23, 42}, {19, 57}, {22, 53}, {22, 61}, {11, 86}},
+ {{40, -37}, {38, -30}, {46, -33}, {42, -30}, {40, -24}, {49, -29},
+ {38, -12}, {40, -10}, {38, -3}, {46, -5}, {31, 20}, {29, 30},
+ {25, 44}, {12, 48}, {11, 49}, {26, 45}, {22, 22}, {23, 22},
+ {27, 21}, {33, 20}, {26, 28}, {30, 24}, {27, 34}, {18, 42},
+ {25, 39}, {18, 50}, {12, 70}, {21, 54}, {14, 71}, {11, 83}},
+ {{37, -17}, {32, 1}, {34, 15}, {29, 15}, {24, 25}, {34, 22},
+ {31, 16}, {35, 18}, {31, 28}, {33, 41}, {36, 28}, {27, 47},
+ {21, 62}, {18, 31}, {19, 26}, {36, 24}, {24, 23}, {27, 16},
+ {24, 30}, {31, 29}, {22, 41}, {22, 42}, {16, 60}, {15, 52},
+ {14, 60}, {3, 78}, {-16, 123}, {21, 53}, {22, 56}, {25, 61}}}},
+
+ {402, 430, { /* 9-24 */
+ {{-4, 79}, {-7, 71}, {-5, 69}, {-9, 70}, {-8, 66}, {-10, 68},
+ {-19, 73}, {-12, 69}, {-16, 70}, {-15, 67}, {-20, 62}, {-19, 70},
+ {-16, 66}, {-22, 65}, {-20, 63}, {9, -2}, {26, -9}, {33, -9},
+ {39, -7}, {41, -2}, {45, 3}, {49, 9}, {45, 27}, {36, 59},
+ {-6, 66}, {-7, 35}, {-7, 42}, {-8, 45}, {-5, 48}},
+ {{-5, 85}, {-6, 81}, {-10, 77}, {-7, 81}, {-17, 80}, {-18, 73},
+ {-4, 74}, {-10, 83}, {-9, 71}, {-9, 67}, {-1, 61}, {-8, 66},
+ {-14, 66}, {0, 59}, {2, 59}, {17, -10}, {32, -13}, {42, -9},
+ {49, -5}, {53, 0}, {64, 3}, {68, 10}, {66, 27}, {47, 57},
+ {-5, 71}, {0, 24}, {-1, 36}, {-2, 42}, {-2, 52}},
+ {{-3, 78}, {-8, 74}, {-9, 72}, {-10, 72}, {-18, 75}, {-12, 71},
+ {-11, 63}, {-5, 70}, {-17, 75}, {-14, 72}, {-16, 67}, {-8, 53},
+ {-14, 59}, {-9, 52}, {-11, 68}, {9, -2}, {30, -10}, {31, -4},
+ {33, -1}, {33, 7}, {31, 12}, {37, 23}, {31, 38}, {20, 64},
+ {-9, 71}, {-7, 37}, {-8, 44}, {-11, 49}, {-10, 56}}}},
+
+ {431, 459, { /* 9-24 */
+ {{-12, 56}, {-6, 60}, {-5, 62}, {-8, 66}, {-8, 76}, {-5, 85},
+ {-6, 81}, {-10, 77}, {-7, 81}, {-17, 80}, {-18, 73}, {-4, 74},
+ {-10, 83}, {-9, 71}, {-9, 67}, {-1, 61}, {-8, 66}, {-14, 66},
+ {0, 59}, {2, 59}, {21, -13}, {33, -14}, {39, -7}, {46, -2},
+ {51, 2}, {60, 6}, {61, 17}, {55, 34}, {42, 62}},
+ {{-9, 57}, {-6, 63}, {-4, 65}, {-4, 67}, {-7, 82}, {-3, 81},
+ {-3, 76}, {-7, 72}, {-6, 78}, {-12, 72}, {-14, 68}, {-3, 70},
+ {-6, 76}, {-5, 66}, {-5, 62}, {0, 57}, {-4, 61}, {-9, 60},
+ {1, 54}, {2, 58}, {17, -10}, {32, -13}, {42, -9}, {49, -5},
+ {53, 0}, {64, 3}, {68, 10}, {66, 27}, {47, 57}},
+ {{-12, 59}, {-8, 63}, {-9, 67}, {-6, 68}, {-10, 79}, {-3, 78},
+ {-8, 74}, {-9, 72}, {-10, 72}, {-18, 75}, {-12, 71}, {-11, 63},
+ {-5, 70}, {-17, 75}, {-14, 72}, {-16, 67}, {-8, 53}, {-14, 59},
+ {-9, 52}, {-11, 68}, {9, -2}, {30, -10}, {31, -4}, {33, -1},
+ {33, 7}, {31, 12}, {37, 23}, {31, 38}, {20, 64}}}},
+};
+
+void
+main(int, char *)
+{
+ int i, c, n;
+ u32int x;
+ mncii *m;
+ Biobuf o;
+
+ Binit(&o, 1, OWRITE);
+ for(c = n = 0; c < 4; c++){
+ for(i = 0; i < nelem(mn); i += 2){
+ if((n % 6) == 0)
+ Bprint(&o, "\t");
+ x = mn[i][0]<<24 | mn[i][1]<<16 | mn[i+1][0]<<8 | mn[i+1][1];
+ Bprint(&o, "0x%08ux", x);
+ if(i+2 == nelem(mn) && c == 3)
+ Bprint(&o, "\n");
+ else
+ Bprint(&o, (++n % 6) ? ", " : ",\n");
+ }
+ for(i = 0; c < 3 && i < nelem(mn_cabac_init_idc); i++){
+ m = mn_cabac_init_idc + i;
+ memmove(mn[m->start], m->mn[c], 2*(m->end-m->start+1));
+ }
+ }
+
+ exits(nil);
+}
--- /dev/null
+++ b/hantest.c
@@ -1,0 +1,60 @@
+#include <u.h>
+#include <libc.h>
+
+static u32int *g1, *g2;
+
+void
+main(int argc, char **argv)
+{
+ ARGBEGIN{
+ }ARGEND
+
+ if((g1 = segattach(0, "vpu_hantro_g1", 0, 0x200)) == (void*)-1)
+ sysfatal("no G1");
+ if((g2 = segattach(0, "vpu_hantro_g2", 0, 0x40c+4)) == (void*)-1)
+ sysfatal("no G2");
+
+ print("bus: ");
+ switch((g1[50]>>16)&7){
+ case 1: print("ahb master, ahb slave"); break;
+ case 2: print("ocp master, ocp slave"); break;
+ case 3: print("axi master, axi slave"); break;
+ case 4: print("axi master, apb slave"); break;
+ case 5: print("axi master, ahb slave"); break;
+ default: print("ERROR\n"); break;
+ }
+ char *buswidth[] = {"ERROR", "32", "64", "128"};
+ print(", %s bit\n", buswidth[(g1[50]>>12)&3]);
+
+ print("cores: %d\n", 1+(g1[54]>>7)&7);
+
+ print("g1: h.264=%d vp8=%d max_owidth=%d\n",
+ !!(g1[57]&(1<<31)),
+ (g1[54]&(1<<23)) && (g1[57]&(1<<20)),
+ ((g1[54]>>14)&3)<<11 | g1[50]&((1<<11)-1)
+ );
+
+ print("g2: hevc=%d (main%d) vp9=%d (profile %d) downscale=%d max_owidth=%d max_oheight=%d\n",
+ !!(g2[23]&(1<<0)),
+ 8 + 2*((g2[23]>>8)&0xf),
+ !!(g2[23]&(1<<1)),
+ 0 + 2*((g2[23]>>12)&0xf),
+ !!(g2[23]&(1<<3)),
+ ((g2[54]>>14)&3)<<11 | g2[50]&((1<<11)-1),
+ g2[56]&((1<<13)-1)
+ );
+
+ print("pp: exists=%d dithering=%d deinterlace=%d upscale=%d downscale=%d max_owidth=%d\n",
+ !!(g1[99]&(1<<31)),
+ !!(g1[100]&(1<<28)),
+ (g1[100]&(1<<25)) && (g1[99]&(1<<30)),
+ !!((g1[100]>>26)&3),
+ ((g1[100]>>26)&3) == 3,
+ g1[100]&((1<<13)-1)
+ );
+
+ segdetach(g1);
+ segdetach(g2);
+
+ exits(nil);
+}
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,8 @@
+</$objtype/mkfile
+
+TARG=hantest cabac
+BIN=/$objtype/bin
+
+default:V: all
+
+</sys/src/cmd/mkmany