History

avcodec/mjpegenc_huffman: Avoid AV_QSORT to sort entries by length

It is unnecessary, as we already have the entries sorted by probability and therefore implicitly by length. All we need on top of that to build the tree is the number of entries of a given length. Doing so gives a 3.6% speedup of ff_mjpeg_encode_huffman_close() here; it also saves about 640B of .text here. The new code puts values with higher probability to the left of the tree. The old code did not and therefore the FATE checksums needed to be updated. Due to MJPEG's 0xFF unescaping file sizes as well as file checksums needed to be updated; the decoded picture hashes stayed the same. Given that codes on the left of the tree have on average fewer bits set than codes on the right, the file sizes mostly improve (all except vsynth3-mjpeg-444).

Andreas Rheinhardt committed 1 year ago

Commit ff9f3fb1 parent c8ce9de22 files · +118 −133Browse files

Unified · Split

22 files
  1. libavcodec/mjpegenc_huffman.c +19 −45
  2. libavcodec/tests/mjpegenc_huffman.c +57 −46
  3. tests/ref/fate/jpg-icc +3 −3
  4. tests/ref/lavf/jpg +2 −2
  5. tests/ref/lavf/smjpeg +2 −2
  6. tests/ref/seek/lavf-jpg +4 −4
  7. tests/ref/vsynth/vsynth1-mjpeg-422 +2 −2
  8. tests/ref/vsynth/vsynth1-mjpeg-444 +2 −2
  9. tests/ref/vsynth/vsynth1-mjpeg-huffman +2 −2
  10. tests/ref/vsynth/vsynth1-mjpeg-trell-huffman +2 −2
  11. tests/ref/vsynth/vsynth2-mjpeg-422 +2 −2
  12. tests/ref/vsynth/vsynth2-mjpeg-444 +2 −2
  13. tests/ref/vsynth/vsynth2-mjpeg-huffman +2 −2
  14. tests/ref/vsynth/vsynth2-mjpeg-trell-huffman +2 −2
  15. tests/ref/vsynth/vsynth3-mjpeg-422 +2 −2
  16. tests/ref/vsynth/vsynth3-mjpeg-444 +2 −2
  17. tests/ref/vsynth/vsynth3-mjpeg-huffman +2 −2
  18. tests/ref/vsynth/vsynth3-mjpeg-trell-huffman +1 −1
  19. tests/ref/vsynth/vsynth_lena-mjpeg-422 +2 −2
  20. tests/ref/vsynth/vsynth_lena-mjpeg-444 +2 −2
  21. tests/ref/vsynth/vsynth_lena-mjpeg-huffman +2 −2
  22. tests/ref/vsynth/vsynth_lena-mjpeg-trell-huffman +2 −2
libavcodec/mjpegenc_huffman.c+19−45
@@ -43,14 +43,6 @@ typedef struct PackageMergerList { · 42 unmodified lines
43 int items[257 * 16]; ///< chain of all individual values that make up items A, B, A, B, C, A, B, C, D, C, D, D, E43 int items[257 * 16]; ///< chain of all individual values that make up items A, B, A, B, C, A, B, C, D, C, D, D, E
44} PackageMergerList;44} PackageMergerList;
45 45
46/**
47 * Used to store optimal huffman encoding results
48 */
49typedef struct HuffTable {
50 int code; ///< code is the input value
51 int length; ///< length of the encoding
52} HuffTable;
53
54/**46/**
55 * Comparison function for two PTables by prob47 * Comparison function for two PTables by prob
56 *48 *
@@ -65,20 +57,6 @@ static int compare_by_prob(const void *a, const void *b) · 8 unmodified lines
65 return a_val.prob - b_val.prob;57 return a_val.prob - b_val.prob;
66}58}
67 59
68/**
69 * Comparison function for two HuffTables by length
70 *
71 * @param a First HuffTable to compare
72 * @param b Second HuffTable to compare
73 * @return < 0 for less than, 0 for equals, > 0 for greater than
74 */
75static int compare_by_length(const void *a, const void *b)
76{
77 HuffTable a_val = *(HuffTable *) a;
78 HuffTable b_val = *(HuffTable *) b;
79 return a_val.length - b_val.length;
80}
81
82/**60/**
83 * Computes the length of the Huffman encoding for each distinct input value.61 * Computes the length of the Huffman encoding for each distinct input value.
84 * Uses package merge algorithm as follows:62 * Uses package merge algorithm as follows:
@@ -92,15 +70,16 @@ static int compare_by_length(const void *a, const void *b) · 7 unmodified lines
92 * 8. the length of the huffman code for symbol s will be equal to the number of times the symbol occurs in the select elements70 * 8. the length of the huffman code for symbol s will be equal to the number of times the symbol occurs in the select elements
93 * Go to guru.multimedia.cx/small-tasks-for-ffmpeg/ for more details71 * Go to guru.multimedia.cx/small-tasks-for-ffmpeg/ for more details
94 *72 *
95 * All probabilities should be positive integers. The output is sorted by code,73 * All probabilities should be nonnegative integers.
96 * not by length.
97 *74 *
98 * @param prob_table input array of a PTable for each distinct input value75 * @param prob_table[in,out] array of a PTable for each distinct input value,
99 * @param distincts output array of a HuffTable that will be populated by this function76 * will be sorted according to ascending probability
100 * @param size size of the prob_table array77 * @param counts[out] the number of values of a given length
101 * @param max_length max length of an encoding78 * @param size number of elements of the prob_table array
79 * @param max_length max length of a code
102 */80 */
103static void mjpegenc_huffman_compute_bits(PTable *prob_table, HuffTable *distincts,81static void mjpegenc_huffman_compute_bits(PTable *prob_table,
82 uint8_t counts[/* max_length + 1 */],
104 int size, int max_length)83 int size, int max_length)
105{84{
106 PackageMergerList list_a, list_b, *to = &list_a, *from = &list_b, *temp;85 PackageMergerList list_a, list_b, *to = &list_a, *from = &list_b, *temp;
@@ -159,14 +138,9 @@ static void mjpegenc_huffman_compute_bits(PTable *prob_table, HuffTable *distinc · 52 unmodified lines
159 }138 }
160 // we don't want to return the 256 bit count (it was just in here to prevent139 // we don't want to return the 256 bit count (it was just in here to prevent
161 // all 1s encoding)140 // all 1s encoding)
162 j = 0;141 memset(counts, 0, sizeof(counts[0]) * (max_length + 1));
163 for (i = 0; i < 256; i++) {142 for (int i = 0; i < 256; ++i)
164 if (nbits[i] > 0) {143 counts[nbits[i]]++;
165 distincts[j].code = i;
166 distincts[j].length = nbits[i];
167 j++;
168 }
169 }
170}144}
171 145
172void ff_mjpeg_encode_huffman_init(MJpegEncHuffmanContext *s)146void ff_mjpeg_encode_huffman_init(MJpegEncHuffmanContext *s)
@@ -186,7 +160,6 @@ void ff_mjpeg_encode_huffman_close(MJpegEncHuffmanContext *s, uint8_t bits[17], · 13 unmodified lines
186 uint8_t val[], int max_nval)160 uint8_t val[], int max_nval)
187{161{
188 PTable val_counts[257];162 PTable val_counts[257];
189 HuffTable distincts[256];
190 163
191 av_assert1(max_nval <= FF_ARRAY_ELEMS(val_counts) - 1);164 av_assert1(max_nval <= FF_ARRAY_ELEMS(val_counts) - 1);
192 165
@@ -201,12 +174,13 @@ void ff_mjpeg_encode_huffman_close(MJpegEncHuffmanContext *s, uint8_t bits[17], · 8 unmodified lines
201 }174 }
202 val_counts[nval].value = 256;175 val_counts[nval].value = 256;
203 val_counts[nval].prob = 0;176 val_counts[nval].prob = 0;
204 mjpegenc_huffman_compute_bits(val_counts, distincts, nval + 1, 16);
205 AV_QSORT(distincts, nval, HuffTable, compare_by_length);
206 177
207 memset(bits, 0, sizeof(bits[0]) * 17);178 mjpegenc_huffman_compute_bits(val_counts, bits, nval + 1, 16);
208 for (int i = 0; i < nval; i++) {179
209 val[i] = distincts[i].code;180 // val_counts[0] is the fake element we added earlier.
210 bits[distincts[i].length]++;181 av_assert1(val_counts[0].prob == 0 && val_counts[0].value == 256);
211 }182 // The following loop puts the values with higher occurence first,
183 // ensuring that they get the shorter codes.
184 for (int i = 0; i < nval; ++i)
185 val[i] = val_counts[nval - i].value;
212}186}
libavcodec/tests/mjpegenc_huffman.c+57−46
@@ -34,10 +34,9 @@ · 33 unmodified lines
34static int check_lengths(int L, const int *probs, int nprobs,34static int check_lengths(int L, const int *probs, int nprobs,
35 int expected_length, const uint8_t expected_len_counts[/* L + 1 */])35 int expected_length, const uint8_t expected_len_counts[/* L + 1 */])
36{36{
37 HuffTable lengths[256];
38 PTable val_counts[256];37 PTable val_counts[256];
39 uint8_t len_counts[17] = { 0 };38 uint8_t len_counts[17];
40 int actual_length = 0, i, j, k, prob, length;39 int actual_length = 0, i;
41 int ret = 0;40 int ret = 0;
42 av_assert0(nprobs <= 256);41 av_assert0(nprobs <= 256);
43 av_assert0(L < FF_ARRAY_ELEMS(len_counts));42 av_assert0(L < FF_ARRAY_ELEMS(len_counts));
@@ -46,20 +45,12 @@ static int check_lengths(int L, const int *probs, int nprobs, · 2 unmodified lines
46 val_counts[i] = (PTable){.value = i, .prob = probs[i]};45 val_counts[i] = (PTable){.value = i, .prob = probs[i]};
47 }46 }
48 47
49 mjpegenc_huffman_compute_bits(val_counts, lengths, nprobs, L);48 mjpegenc_huffman_compute_bits(val_counts, len_counts, nprobs, L);
50 49
51 for (int i = 0; i < nprobs; ++i) {
52 if (lengths[i].length > L) {
53 fprintf(stderr,
54 "Len %d of element %d of Huffman table with %d elements exceeds max length %d\n",
55 lengths[i].length, i, nprobs, L);
56 return 1;
57 }
58 len_counts[lengths[i].length]++;
59 }
60 // Test that the lengths can be made part of a complete, prefix-free tree:50 // Test that the lengths can be made part of a complete, prefix-free tree:
61 unsigned code = 0;51 unsigned code = 0, count = 0;
62 for (int i = 1; i <= L; ++i) {52 for (int i = 1; i <= L; ++i) {
53 count += len_counts[i];
63 code <<= 1;54 code <<= 1;
64 code += len_counts[i];55 code += len_counts[i];
65 }56 }
@@ -67,22 +58,36 @@ static int check_lengths(int L, const int *probs, int nprobs, · 1 unmodified line
67 fprintf(stderr, "Huffman tree overdetermined/invalid\n");58 fprintf(stderr, "Huffman tree overdetermined/invalid\n");
68 ret = 1;59 ret = 1;
69 }60 }
70 61 if (count != nprobs) {
71 for (i = 0; i < nprobs; i++) {62 fprintf(stderr, "Total count %u does not match expected value %d\n",
72 // Find the value's prob and length63 count, nprobs);
73 for (j = 0; j < nprobs; j++)64 ret = 1;
74 if (val_counts[j].value == i) break;65 }
75 for (k = 0; k < nprobs; k++)66 // Test that the input values have been properly ordered.
76 if (lengths[k].code == i) break;67 for (unsigned i = 0; i < count; ++i) {
77 if (!(j < nprobs && k < nprobs)) return 1;68 if (val_counts[i].prob != probs[val_counts[i].value]) {
78 prob = val_counts[j].prob;69 fprintf(stderr, "PTable not properly reordered\n");
79 length = lengths[k].length;70 ret = 1;
80 71 }
81 if (prob) {72 if (i && val_counts[i - 1].prob > val_counts[i].prob) {
82 actual_length += prob * length;73 fprintf(stderr, "PTable not order ascendingly: [%u] = %d > [%u] = %d\n",
74 i - 1, val_counts[i - 1].prob, i, val_counts[i].prob);
75 ret = 1;
76 }
77 unsigned j;
78 for (j = 0; j < count; ++j)
79 if (val_counts[j].value == i)
80 break;
81 if (j >= count) {
82 fprintf(stderr, "Element %u missing after sorting\n", i);
83 ret = 1;
83 }84 }
84 85 }
85 if (length > L || length < 1) return 1;86 for (int len = L, j = 0; len; --len) {
87 int prob = 0;
88 for (int end = j + len_counts[len]; j < end; ++j)
89 prob += val_counts[j].prob;
90 actual_length += prob * len;
86 }91 }
87 // Check that the total length is optimal92 // Check that the total length is optimal
88 if (actual_length != expected_length) ret = 1;93 if (actual_length != expected_length) ret = 1;
@@ -141,7 +146,10 @@ static const uint8_t len_counts_sat[] = { · 52 unmodified lines
141// http://guru.multimedia.cx/small-tasks-for-ffmpeg/146// http://guru.multimedia.cx/small-tasks-for-ffmpeg/
142int main(int argc, char **argv)147int main(int argc, char **argv)
143{148{
144 int i, ret = 0;149 enum {
150 MAX_LEN = 3,
151 };
152 int ret = 0;
145 // Probabilities of symbols 0..4153 // Probabilities of symbols 0..4
146 PTable val_counts[] = {154 PTable val_counts[] = {
147 {.value = 0, .prob = 1},155 {.value = 0, .prob = 1},
@@ -151,30 +159,33 @@ int main(int argc, char **argv) · 3 unmodified lines
151 {.value = 4, .prob = 21},159 {.value = 4, .prob = 21},
152 };160 };
153 // Expected code lengths for each symbol161 // Expected code lengths for each symbol
154 static const HuffTable expected[] = {162 static const uint8_t expected[MAX_LEN + 1] = {
155 {.code = 0, .length = 3},163 [1] = 1, [3] = 4,
156 {.code = 1, .length = 3},
157 {.code = 2, .length = 3},
158 {.code = 3, .length = 3},
159 {.code = 4, .length = 1},
160 };164 };
161 // Actual code lengths165 // Actual code lengths
162 HuffTable distincts[5];166 uint8_t len_counts[MAX_LEN + 1];
163 167
164 // Build optimal huffman tree using an internal function, to allow for168 // Build optimal huffman tree using an internal function, to allow for
165 // smaller-than-normal test cases. This mutates val_counts by sorting.169 // smaller-than-normal test cases. This mutates val_counts by sorting.
166 mjpegenc_huffman_compute_bits(val_counts, distincts,170 mjpegenc_huffman_compute_bits(val_counts, len_counts,
167 FF_ARRAY_ELEMS(distincts), 3);171 FF_ARRAY_ELEMS(val_counts), MAX_LEN);
168 172
169 for (i = 0; i < FF_ARRAY_ELEMS(distincts); i++) {173 for (unsigned i = 1; i < FF_ARRAY_ELEMS(len_counts); i++) {
170 if (distincts[i].code != expected[i].code ||174 if (len_counts[i] != expected[i]) {
171 distincts[i].length != expected[i].length) {
172 fprintf(stderr,175 fprintf(stderr,
173 "Built huffman does not equal expectations. "176 "Built huffman does not equal expectations. "
174 "Expected: code %d probability %d, "177 "Expected: %d codes of length %u, "
175 "Actual: code %d probability %d\n",178 "Actual: %d codes of length %u\n",
176 expected[i].code, expected[i].length,179 (int)expected[i], i,
177 distincts[i].code, distincts[i].length);180 (int)len_counts[i], i);
181 ret = 1;
182 }
183 }
184 for (unsigned i = 1; i < FF_ARRAY_ELEMS(val_counts); ++i) {
185 if (val_counts[i - 1].prob > val_counts[i].prob) {
186 fprintf(stderr, "Probability table not ordered ascendingly. "
187 "val_counts[%u] == %d, val_counts[%u] == %d\n",
188 i - 1, val_counts[i - 1].prob, i, val_counts[i].prob);
178 ret = 1;189 ret = 1;
179 }190 }
180 }191 }
tests/ref/fate/jpg-icc+3−3
@@ -1,5 +1,5 @@
15c83d22a628d01c095704f58328f63c9 *tests/data/fate/jpg-icc.mjpeg14d8f3d93f55267cc90bd1d2a94cfa84f *tests/data/fate/jpg-icc.mjpeg
211016 tests/data/fate/jpg-icc.mjpeg211011 tests/data/fate/jpg-icc.mjpeg
3#tb 0: 1/253#tb 0: 1/25
4#media_type 0: video4#media_type 0: video
5#codec_id 0: rawvideo5#codec_id 0: rawvideo
@@ -19,7 +19,7 @@ best_effort_timestamp_time=0.000000 · 13 unmodified lines
19duration=119duration=1
20duration_time=0.04000020duration_time=0.040000
21pkt_pos=021pkt_pos=0
22pkt_size=1101622pkt_size=11011
23width=12823width=128
24height=12824height=128
25crop_top=025crop_top=0
tests/ref/lavf/jpg+2−2
@@ -1,3 +1,3 @@
164885ae70c3450b50196ce687a672dbe *tests/data/images/jpg/02.jpg1c7b9382883d021b6535096f58d83c72c *tests/data/images/jpg/02.jpg
226062 tests/data/images/jpg/02.jpg226057 tests/data/images/jpg/02.jpg
3tests/data/images/jpg/%02d.jpg CRC=0x1c357a3e3tests/data/images/jpg/%02d.jpg CRC=0x1c357a3e
tests/ref/lavf/smjpeg+2−2
@@ -1,3 +1,3 @@
1659757345ce01f8a5c4c1373bd073d41 *tests/data/lavf/lavf.smjpeg19278aa4b2eafa6b863fc6085b43abd8d *tests/data/lavf/lavf.smjpeg
2728268 tests/data/lavf/lavf.smjpeg2728177 tests/data/lavf/lavf.smjpeg
3tests/data/lavf/lavf.smjpeg CRC=0x29d58fb83tests/data/lavf/lavf.smjpeg CRC=0x29d58fb8
tests/ref/seek/lavf-jpg+4−4
@@ -1,4 +1,4 @@
1ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: -1 size: 256331ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: -1 size: 25629
2ret:-EINVAL st:-1 flags:0 ts:-1.0000002ret:-EINVAL st:-1 flags:0 ts:-1.000000
3ret:-EINVAL st:-1 flags:1 ts: 1.8941673ret:-EINVAL st:-1 flags:1 ts: 1.894167
4ret:-EINVAL st: 0 flags:0 ts: 0.8000004ret:-EINVAL st: 0 flags:0 ts: 0.800000
@@ -6,7 +6,7 @@ ret:-EINVAL st: 0 flags:1 ts:-0.320000 · 1 unmodified line
6ret:-EINVAL st:-1 flags:0 ts: 2.5766686ret:-EINVAL st:-1 flags:0 ts: 2.576668
7ret:-EINVAL st:-1 flags:1 ts: 1.4708357ret:-EINVAL st:-1 flags:1 ts: 1.470835
8ret: 0 st: 0 flags:0 ts: 0.3600008ret: 0 st: 0 flags:0 ts: 0.360000
9ret: 0 st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos: -1 size: 253129ret: 0 st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos: -1 size: 25304
10ret:-EINVAL st: 0 flags:1 ts:-0.76000010ret:-EINVAL st: 0 flags:1 ts:-0.760000
11ret:-EINVAL st:-1 flags:0 ts: 2.15333611ret:-EINVAL st:-1 flags:0 ts: 2.153336
12ret:-EINVAL st:-1 flags:1 ts: 1.04750312ret:-EINVAL st:-1 flags:1 ts: 1.047503
@@ -18,7 +18,7 @@ ret:-EINVAL st: 0 flags:0 ts:-0.480000 · 5 unmodified lines
18ret:-EINVAL st: 0 flags:1 ts: 2.40000018ret:-EINVAL st: 0 flags:1 ts: 2.400000
19ret:-EINVAL st:-1 flags:0 ts: 1.30667219ret:-EINVAL st:-1 flags:0 ts: 1.306672
20ret: 0 st:-1 flags:1 ts: 0.20083920ret: 0 st:-1 flags:1 ts: 0.200839
21ret: 0 st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos: -1 size: 2579921ret: 0 st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos: -1 size: 25798
22ret:-EINVAL st: 0 flags:0 ts:-0.92000022ret:-EINVAL st: 0 flags:0 ts:-0.920000
23ret:-EINVAL st: 0 flags:1 ts: 2.00000023ret:-EINVAL st: 0 flags:1 ts: 2.000000
24ret:-EINVAL st:-1 flags:0 ts: 0.88334024ret:-EINVAL st:-1 flags:0 ts: 0.883340
@@ -26,5 +26,5 @@ ret:-EINVAL st:-1 flags:1 ts:-0.222493 · 1 unmodified line
26ret:-EINVAL st: 0 flags:0 ts: 2.68000026ret:-EINVAL st: 0 flags:0 ts: 2.680000
27ret:-EINVAL st: 0 flags:1 ts: 1.56000027ret:-EINVAL st: 0 flags:1 ts: 1.560000
28ret: 0 st:-1 flags:0 ts: 0.46000828ret: 0 st:-1 flags:0 ts: 0.460008
29ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: -1 size: 2548929ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: -1 size: 25488
30ret:-EINVAL st:-1 flags:1 ts:-0.64582530ret:-EINVAL st:-1 flags:1 ts:-0.645825
tests/ref/vsynth/vsynth1-mjpeg-422+2−2
@@ -1,4 +1,4 @@
1eb0f7dc02efd5f4ab7ea3c73617801a3 *tests/data/fate/vsynth1-mjpeg-422.avi1c3f2891bf340dc5bafde50feb236a55d *tests/data/fate/vsynth1-mjpeg-422.avi
21611674 tests/data/fate/vsynth1-mjpeg-422.avi21611442 tests/data/fate/vsynth1-mjpeg-422.avi
3bc62d53cce32a595a0c6e9c318e4ce3e *tests/data/fate/vsynth1-mjpeg-422.out.rawvideo3bc62d53cce32a595a0c6e9c318e4ce3e *tests/data/fate/vsynth1-mjpeg-422.out.rawvideo
4stddev: 7.45 PSNR: 30.69 MAXDIFF: 63 bytes: 7603200/ 76032004stddev: 7.45 PSNR: 30.69 MAXDIFF: 63 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth1-mjpeg-444+2−2
@@ -1,4 +1,4 @@
1bfde676dad356228f77aa319f046db8a *tests/data/fate/vsynth1-mjpeg-444.avi16df1ef3c72846b43b7bbaaed6272e433 *tests/data/fate/vsynth1-mjpeg-444.avi
21831606 tests/data/fate/vsynth1-mjpeg-444.avi21831046 tests/data/fate/vsynth1-mjpeg-444.avi
3c51ee467d03242dfc1e4536b0485d00f *tests/data/fate/vsynth1-mjpeg-444.out.rawvideo3c51ee467d03242dfc1e4536b0485d00f *tests/data/fate/vsynth1-mjpeg-444.out.rawvideo
4stddev: 7.37 PSNR: 30.77 MAXDIFF: 63 bytes: 7603200/ 76032004stddev: 7.37 PSNR: 30.77 MAXDIFF: 63 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth1-mjpeg-huffman+2−2
@@ -1,4 +1,4 @@
1827f4da674de95b4227aadda8dbdaa77 *tests/data/fate/vsynth1-mjpeg-huffman.avi1f42cd955597ade05b81c7e4b0fc35e5a *tests/data/fate/vsynth1-mjpeg-huffman.avi
21391436 tests/data/fate/vsynth1-mjpeg-huffman.avi21391116 tests/data/fate/vsynth1-mjpeg-huffman.avi
3f46e58458ea57495a494650f7153829d *tests/data/fate/vsynth1-mjpeg-huffman.out.rawvideo3f46e58458ea57495a494650f7153829d *tests/data/fate/vsynth1-mjpeg-huffman.out.rawvideo
4stddev: 7.87 PSNR: 30.21 MAXDIFF: 63 bytes: 7603200/ 76032004stddev: 7.87 PSNR: 30.21 MAXDIFF: 63 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth1-mjpeg-trell-huffman+2−2
@@ -1,4 +1,4 @@
1e097a118dd37b3ab5607278d7b675ea3 *tests/data/fate/vsynth1-mjpeg-trell-huffman.avi1af1ed7a7536b2a84e8b91b2bbbfa4f9c *tests/data/fate/vsynth1-mjpeg-trell-huffman.avi
21361112 tests/data/fate/vsynth1-mjpeg-trell-huffman.avi21360828 tests/data/fate/vsynth1-mjpeg-trell-huffman.avi
3548de4f6098cbc3d8b65574bb93faf09 *tests/data/fate/vsynth1-mjpeg-trell-huffman.out.rawvideo3548de4f6098cbc3d8b65574bb93faf09 *tests/data/fate/vsynth1-mjpeg-trell-huffman.out.rawvideo
4stddev: 7.67 PSNR: 30.42 MAXDIFF: 62 bytes: 7603200/ 76032004stddev: 7.67 PSNR: 30.42 MAXDIFF: 62 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth2-mjpeg-422+2−2
@@ -1,4 +1,4 @@
167a35df8ef714568db0362f4dce400fb *tests/data/fate/vsynth2-mjpeg-422.avi1d1e682a3468093c55b9579b5c2499b14 *tests/data/fate/vsynth2-mjpeg-422.avi
2877718 tests/data/fate/vsynth2-mjpeg-422.avi2877194 tests/data/fate/vsynth2-mjpeg-422.avi
37fae296bb4290d09971a629040eac072 *tests/data/fate/vsynth2-mjpeg-422.out.rawvideo37fae296bb4290d09971a629040eac072 *tests/data/fate/vsynth2-mjpeg-422.out.rawvideo
4stddev: 4.69 PSNR: 34.69 MAXDIFF: 55 bytes: 7603200/ 76032004stddev: 4.69 PSNR: 34.69 MAXDIFF: 55 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth2-mjpeg-444+2−2
@@ -1,4 +1,4 @@
124e04a6e3b645b3314e522cc6b4d3fb7 *tests/data/fate/vsynth2-mjpeg-444.avi1b8d276c9017a3018266db3e35e8592df *tests/data/fate/vsynth2-mjpeg-444.avi
21005214 tests/data/fate/vsynth2-mjpeg-444.avi21004766 tests/data/fate/vsynth2-mjpeg-444.avi
3fbeca59755dfb2b5e2f2c9781756d634 *tests/data/fate/vsynth2-mjpeg-444.out.rawvideo3fbeca59755dfb2b5e2f2c9781756d634 *tests/data/fate/vsynth2-mjpeg-444.out.rawvideo
4stddev: 4.57 PSNR: 34.93 MAXDIFF: 55 bytes: 7603200/ 76032004stddev: 4.57 PSNR: 34.93 MAXDIFF: 55 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth2-mjpeg-huffman+2−2
@@ -1,4 +1,4 @@
12a959ad89469d88894d03dc9ce83e8b9 *tests/data/fate/vsynth2-mjpeg-huffman.avi1abca59bd27519877a448c508c046df46 *tests/data/fate/vsynth2-mjpeg-huffman.avi
2792950 tests/data/fate/vsynth2-mjpeg-huffman.avi2792444 tests/data/fate/vsynth2-mjpeg-huffman.avi
3fe498d9edaa947e435e4f353c194ef3d *tests/data/fate/vsynth2-mjpeg-huffman.out.rawvideo3fe498d9edaa947e435e4f353c194ef3d *tests/data/fate/vsynth2-mjpeg-huffman.out.rawvideo
4stddev: 4.87 PSNR: 34.37 MAXDIFF: 55 bytes: 7603200/ 76032004stddev: 4.87 PSNR: 34.37 MAXDIFF: 55 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth2-mjpeg-trell-huffman+2−2
@@ -1,4 +1,4 @@
1d6a09ff8a46c297934496d8089cdd2a2 *tests/data/fate/vsynth2-mjpeg-trell-huffman.avi1d16eaa6ece27bc10715f24509334c402 *tests/data/fate/vsynth2-mjpeg-trell-huffman.avi
2734896 tests/data/fate/vsynth2-mjpeg-trell-huffman.avi2734736 tests/data/fate/vsynth2-mjpeg-trell-huffman.avi
38612dfee87e32268f6f533188a097785 *tests/data/fate/vsynth2-mjpeg-trell-huffman.out.rawvideo38612dfee87e32268f6f533188a097785 *tests/data/fate/vsynth2-mjpeg-trell-huffman.out.rawvideo
4stddev: 5.03 PSNR: 34.10 MAXDIFF: 67 bytes: 7603200/ 76032004stddev: 5.03 PSNR: 34.10 MAXDIFF: 67 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth3-mjpeg-422+2−2
@@ -1,4 +1,4 @@
19aa0f90dac7ef923a0be0d93ca7dc039 *tests/data/fate/vsynth3-mjpeg-422.avi19377167f1597b9b2d0e3a8abb5244eba *tests/data/fate/vsynth3-mjpeg-422.avi
252620 tests/data/fate/vsynth3-mjpeg-422.avi252614 tests/data/fate/vsynth3-mjpeg-422.avi
37c64ab866add1e59fe7c34feed006df1 *tests/data/fate/vsynth3-mjpeg-422.out.rawvideo37c64ab866add1e59fe7c34feed006df1 *tests/data/fate/vsynth3-mjpeg-422.out.rawvideo
4stddev: 8.22 PSNR: 29.82 MAXDIFF: 58 bytes: 86700/ 867004stddev: 8.22 PSNR: 29.82 MAXDIFF: 58 bytes: 86700/ 86700
tests/ref/vsynth/vsynth3-mjpeg-444+2−2
@@ -1,4 +1,4 @@
1c063ea1cddfc2a360b92f05d1811ea93 *tests/data/fate/vsynth3-mjpeg-444.avi1ff215eb039c4d2ef34b891c25ffe0fbd *tests/data/fate/vsynth3-mjpeg-444.avi
253954 tests/data/fate/vsynth3-mjpeg-444.avi253958 tests/data/fate/vsynth3-mjpeg-444.avi
38bbbfeab8b3f6788719e1f0f77ce8612 *tests/data/fate/vsynth3-mjpeg-444.out.rawvideo38bbbfeab8b3f6788719e1f0f77ce8612 *tests/data/fate/vsynth3-mjpeg-444.out.rawvideo
4stddev: 8.21 PSNR: 29.84 MAXDIFF: 58 bytes: 86700/ 867004stddev: 8.21 PSNR: 29.84 MAXDIFF: 58 bytes: 86700/ 86700
tests/ref/vsynth/vsynth3-mjpeg-huffman+2−2
@@ -1,4 +1,4 @@
162a7732fcb9288a7223671b23ce06fa0 *tests/data/fate/vsynth3-mjpeg-huffman.avi152b7c3884957ac81fe1b8e1ecf40827b *tests/data/fate/vsynth3-mjpeg-huffman.avi
248170 tests/data/fate/vsynth3-mjpeg-huffman.avi248152 tests/data/fate/vsynth3-mjpeg-huffman.avi
3a6daba607898eb6e1a172c2368084a67 *tests/data/fate/vsynth3-mjpeg-huffman.out.rawvideo3a6daba607898eb6e1a172c2368084a67 *tests/data/fate/vsynth3-mjpeg-huffman.out.rawvideo
4stddev: 8.61 PSNR: 29.43 MAXDIFF: 58 bytes: 86700/ 867004stddev: 8.61 PSNR: 29.43 MAXDIFF: 58 bytes: 86700/ 86700
tests/ref/vsynth/vsynth3-mjpeg-trell-huffman+1−1
@@ -1,4 +1,4 @@
17cbc02d85a572b5ea871c014ce27ab4c *tests/data/fate/vsynth3-mjpeg-trell-huffman.avi1fcfa06df101f91ac19793dc90c4c918c *tests/data/fate/vsynth3-mjpeg-trell-huffman.avi
247834 tests/data/fate/vsynth3-mjpeg-trell-huffman.avi247834 tests/data/fate/vsynth3-mjpeg-trell-huffman.avi
307822517628b20d54621df666ea79af3 *tests/data/fate/vsynth3-mjpeg-trell-huffman.out.rawvideo307822517628b20d54621df666ea79af3 *tests/data/fate/vsynth3-mjpeg-trell-huffman.out.rawvideo
4stddev: 8.27 PSNR: 29.78 MAXDIFF: 55 bytes: 86700/ 867004stddev: 8.27 PSNR: 29.78 MAXDIFF: 55 bytes: 86700/ 86700
tests/ref/vsynth/vsynth_lena-mjpeg-422+2−2
@@ -1,4 +1,4 @@
1494812cc00c2d51df2d9cbc03dc9eecd *tests/data/fate/vsynth_lena-mjpeg-422.avi1778be0c8ee9c030aa2838bf249874082 *tests/data/fate/vsynth_lena-mjpeg-422.avi
2707466 tests/data/fate/vsynth_lena-mjpeg-422.avi2707170 tests/data/fate/vsynth_lena-mjpeg-422.avi
316d2be35266d303dff3361e4535e8dd8 *tests/data/fate/vsynth_lena-mjpeg-422.out.rawvideo316d2be35266d303dff3361e4535e8dd8 *tests/data/fate/vsynth_lena-mjpeg-422.out.rawvideo
4stddev: 4.18 PSNR: 35.70 MAXDIFF: 49 bytes: 7603200/ 76032004stddev: 4.18 PSNR: 35.70 MAXDIFF: 49 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth_lena-mjpeg-444+2−2
@@ -1,4 +1,4 @@
152996e606d20fe34c327a206be066091 *tests/data/fate/vsynth_lena-mjpeg-444.avi1a48b1f2d17264bce552cfcd920df1ea9 *tests/data/fate/vsynth_lena-mjpeg-444.avi
2807472 tests/data/fate/vsynth_lena-mjpeg-444.avi2807190 tests/data/fate/vsynth_lena-mjpeg-444.avi
30db1c1942d750b107acf2acfbe08eacb *tests/data/fate/vsynth_lena-mjpeg-444.out.rawvideo30db1c1942d750b107acf2acfbe08eacb *tests/data/fate/vsynth_lena-mjpeg-444.out.rawvideo
4stddev: 4.05 PSNR: 35.96 MAXDIFF: 49 bytes: 7603200/ 76032004stddev: 4.05 PSNR: 35.96 MAXDIFF: 49 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth_lena-mjpeg-huffman+2−2
@@ -1,4 +1,4 @@
1d8b968d6ecaa83bb120eb0dd08c3f6df *tests/data/fate/vsynth_lena-mjpeg-huffman.avi180bf47172b96ad68be829c4f46073299 *tests/data/fate/vsynth_lena-mjpeg-huffman.avi
2635642 tests/data/fate/vsynth_lena-mjpeg-huffman.avi2635256 tests/data/fate/vsynth_lena-mjpeg-huffman.avi
3095f88a721813c2a1c34b26303c1139a *tests/data/fate/vsynth_lena-mjpeg-huffman.out.rawvideo3095f88a721813c2a1c34b26303c1139a *tests/data/fate/vsynth_lena-mjpeg-huffman.out.rawvideo
4stddev: 4.33 PSNR: 35.40 MAXDIFF: 49 bytes: 7603200/ 76032004stddev: 4.33 PSNR: 35.40 MAXDIFF: 49 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth_lena-mjpeg-trell-huffman+2−2
@@ -1,4 +1,4 @@
18217aef7ee16709b2c0591a9a28d9bb8 *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi1dc66c0700d50235965fd3fabdcb9a214 *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi
2582648 tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi2582552 tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi
38c5c05e82a959ccc8b3c4ba8e4123bbe *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.out.rawvideo38c5c05e82a959ccc8b3c4ba8e4123bbe *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.out.rawvideo
4stddev: 4.51 PSNR: 35.04 MAXDIFF: 60 bytes: 7603200/ 76032004stddev: 4.51 PSNR: 35.04 MAXDIFF: 60 bytes: 7603200/ 7603200

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t