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
4343 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
4444 } PackageMergerList;
4545
46−/**
47− * Used to store optimal huffman encoding results
48− */
49−typedef struct HuffTable {
50− int code; ///< code is the input value
51− int length; ///< length of the encoding
52−} HuffTable;
53−
5446 /**
5547 * Comparison function for two PTables by prob
5648 *
@@ -65,20 +57,6 @@ static int compare_by_prob(const void *a, const void *b) · 8 unmodified lines
6557 return a_val.prob - b_val.prob;
6658 }
6759
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− */
75−static 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−
8260 /**
8361 * Computes the length of the Huffman encoding for each distinct input value.
8462 * Uses package merge algorithm as follows:
@@ -92,15 +70,16 @@ static int compare_by_length(const void *a, const void *b) · 7 unmodified lines
9270 * 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
9371 * Go to guru.multimedia.cx/small-tasks-for-ffmpeg/ for more details
9472 *
95− * All probabilities should be positive integers. The output is sorted by code,
96− * not by length.
73+ * All probabilities should be nonnegative integers.
9774 *
98− * @param prob_table input array of a PTable for each distinct input value
99− * @param distincts output array of a HuffTable that will be populated by this function
100− * @param size size of the prob_table array
101− * @param max_length max length of an encoding
75+ * @param prob_table[in,out] array of a PTable for each distinct input value,
76+ * will be sorted according to ascending probability
77+ * @param counts[out] the number of values of a given length
78+ * @param size number of elements of the prob_table array
79+ * @param max_length max length of a code
10280 */
103−static void mjpegenc_huffman_compute_bits(PTable *prob_table, HuffTable *distincts,
81+static void mjpegenc_huffman_compute_bits(PTable *prob_table,
82+ uint8_t counts[/* max_length + 1 */],
10483 int size, int max_length)
10584 {
10685 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
159138 }
160139 // we don't want to return the 256 bit count (it was just in here to prevent
161140 // all 1s encoding)
162− j = 0;
163− for (i = 0; i < 256; i++) {
164− if (nbits[i] > 0) {
165− distincts[j].code = i;
166− distincts[j].length = nbits[i];
167− j++;
168− }
169− }
141+ memset(counts, 0, sizeof(counts[0]) * (max_length + 1));
142+ for (int i = 0; i < 256; ++i)
143+ counts[nbits[i]]++;
170144 }
171145
172146 void 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
186160 uint8_t val[], int max_nval)
187161 {
188162 PTable val_counts[257];
189− HuffTable distincts[256];
190163
191164 av_assert1(max_nval <= FF_ARRAY_ELEMS(val_counts) - 1);
192165
@@ -201,12 +174,13 @@ void ff_mjpeg_encode_huffman_close(MJpegEncHuffmanContext *s, uint8_t bits[17], · 8 unmodified lines
201174 }
202175 val_counts[nval].value = 256;
203176 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);
206177
207− memset(bits, 0, sizeof(bits[0]) * 17);
208− for (int i = 0; i < nval; i++) {
209− val[i] = distincts[i].code;
210− bits[distincts[i].length]++;
211− }
178+ mjpegenc_huffman_compute_bits(val_counts, bits, nval + 1, 16);
179+
180+ // val_counts[0] is the fake element we added earlier.
181+ av_assert1(val_counts[0].prob == 0 && val_counts[0].value == 256);
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;
212186 }
libavcodec/tests/mjpegenc_huffman.c+57−46
@@ -34,10 +34,9 @@ · 33 unmodified lines
3434 static int check_lengths(int L, const int *probs, int nprobs,
3535 int expected_length, const uint8_t expected_len_counts[/* L + 1 */])
3636 {
37− HuffTable lengths[256];
3837 PTable val_counts[256];
39− uint8_t len_counts[17] = { 0 };
40− int actual_length = 0, i, j, k, prob, length;
38+ uint8_t len_counts[17];
39+ int actual_length = 0, i;
4140 int ret = 0;
4241 av_assert0(nprobs <= 256);
4342 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
4645 val_counts[i] = (PTable){.value = i, .prob = probs[i]};
4746 }
4847
49− mjpegenc_huffman_compute_bits(val_counts, lengths, nprobs, L);
48+ mjpegenc_huffman_compute_bits(val_counts, len_counts, nprobs, L);
5049
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− }
6050 // Test that the lengths can be made part of a complete, prefix-free tree:
61− unsigned code = 0;
51+ unsigned code = 0, count = 0;
6252 for (int i = 1; i <= L; ++i) {
53+ count += len_counts[i];
6354 code <<= 1;
6455 code += len_counts[i];
6556 }
@@ -67,22 +58,36 @@ static int check_lengths(int L, const int *probs, int nprobs, · 1 unmodified line
6758 fprintf(stderr, "Huffman tree overdetermined/invalid\n");
6859 ret = 1;
6960 }
70−
71− for (i = 0; i < nprobs; i++) {
72− // Find the value's prob and length
73− for (j = 0; j < nprobs; j++)
74− if (val_counts[j].value == i) break;
75− for (k = 0; k < nprobs; k++)
76− if (lengths[k].code == i) break;
77− if (!(j < nprobs && k < nprobs)) return 1;
78− prob = val_counts[j].prob;
79− length = lengths[k].length;
80−
81− if (prob) {
82− actual_length += prob * length;
61+ if (count != nprobs) {
62+ fprintf(stderr, "Total count %u does not match expected value %d\n",
63+ count, nprobs);
64+ ret = 1;
65+ }
66+ // Test that the input values have been properly ordered.
67+ for (unsigned i = 0; i < count; ++i) {
68+ if (val_counts[i].prob != probs[val_counts[i].value]) {
69+ fprintf(stderr, "PTable not properly reordered\n");
70+ ret = 1;
71+ }
72+ if (i && val_counts[i - 1].prob > val_counts[i].prob) {
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;
8384 }
84−
85− if (length > L || length < 1) return 1;
85+ }
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;
8691 }
8792 // Check that the total length is optimal
8893 if (actual_length != expected_length) ret = 1;
@@ -141,7 +146,10 @@ static const uint8_t len_counts_sat[] = { · 52 unmodified lines
141146 // http://guru.multimedia.cx/small-tasks-for-ffmpeg/
142147 int main(int argc, char **argv)
143148 {
144− int i, ret = 0;
149+ enum {
150+ MAX_LEN = 3,
151+ };
152+ int ret = 0;
145153 // Probabilities of symbols 0..4
146154 PTable val_counts[] = {
147155 {.value = 0, .prob = 1},
@@ -151,30 +159,33 @@ int main(int argc, char **argv) · 3 unmodified lines
151159 {.value = 4, .prob = 21},
152160 };
153161 // Expected code lengths for each symbol
154− static const HuffTable expected[] = {
155− {.code = 0, .length = 3},
156− {.code = 1, .length = 3},
157− {.code = 2, .length = 3},
158− {.code = 3, .length = 3},
159− {.code = 4, .length = 1},
162+ static const uint8_t expected[MAX_LEN + 1] = {
163+ [1] = 1, [3] = 4,
160164 };
161165 // Actual code lengths
162− HuffTable distincts[5];
166+ uint8_t len_counts[MAX_LEN + 1];
163167
164168 // Build optimal huffman tree using an internal function, to allow for
165169 // smaller-than-normal test cases. This mutates val_counts by sorting.
166− mjpegenc_huffman_compute_bits(val_counts, distincts,
167− FF_ARRAY_ELEMS(distincts), 3);
170+ mjpegenc_huffman_compute_bits(val_counts, len_counts,
171+ FF_ARRAY_ELEMS(val_counts), MAX_LEN);
168172
169− for (i = 0; i < FF_ARRAY_ELEMS(distincts); i++) {
170− if (distincts[i].code != expected[i].code ||
171− distincts[i].length != expected[i].length) {
173+ for (unsigned i = 1; i < FF_ARRAY_ELEMS(len_counts); i++) {
174+ if (len_counts[i] != expected[i]) {
172175 fprintf(stderr,
173176 "Built huffman does not equal expectations. "
174− "Expected: code %d probability %d, "
175− "Actual: code %d probability %d\n",
176− expected[i].code, expected[i].length,
177− distincts[i].code, distincts[i].length);
177+ "Expected: %d codes of length %u, "
178+ "Actual: %d codes of length %u\n",
179+ (int)expected[i], i,
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);
178189 ret = 1;
179190 }
180191 }
tests/ref/fate/jpg-icc+3−3
@@ -1,5 +1,5 @@
1−5c83d22a628d01c095704f58328f63c9 *tests/data/fate/jpg-icc.mjpeg
2−11016 tests/data/fate/jpg-icc.mjpeg
1+4d8f3d93f55267cc90bd1d2a94cfa84f *tests/data/fate/jpg-icc.mjpeg
2+11011 tests/data/fate/jpg-icc.mjpeg
33 #tb 0: 1/25
44 #media_type 0: video
55 #codec_id 0: rawvideo
@@ -19,7 +19,7 @@ best_effort_timestamp_time=0.000000 · 13 unmodified lines
1919 duration=1
2020 duration_time=0.040000
2121 pkt_pos=0
22−pkt_size=11016
22+pkt_size=11011
2323 width=128
2424 height=128
2525 crop_top=0
tests/ref/lavf/jpg+2−2
@@ -1,3 +1,3 @@
1−64885ae70c3450b50196ce687a672dbe *tests/data/images/jpg/02.jpg
2−26062 tests/data/images/jpg/02.jpg
1+c7b9382883d021b6535096f58d83c72c *tests/data/images/jpg/02.jpg
2+26057 tests/data/images/jpg/02.jpg
33 tests/data/images/jpg/%02d.jpg CRC=0x1c357a3e
tests/ref/lavf/smjpeg+2−2
@@ -1,3 +1,3 @@
1−659757345ce01f8a5c4c1373bd073d41 *tests/data/lavf/lavf.smjpeg
2−728268 tests/data/lavf/lavf.smjpeg
1+9278aa4b2eafa6b863fc6085b43abd8d *tests/data/lavf/lavf.smjpeg
2+728177 tests/data/lavf/lavf.smjpeg
33 tests/data/lavf/lavf.smjpeg CRC=0x29d58fb8
tests/ref/seek/lavf-jpg+4−4
@@ -1,4 +1,4 @@
1−ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: -1 size: 25633
1+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: -1 size: 25629
22 ret:-EINVAL st:-1 flags:0 ts:-1.000000
33 ret:-EINVAL st:-1 flags:1 ts: 1.894167
44 ret:-EINVAL st: 0 flags:0 ts: 0.800000
@@ -6,7 +6,7 @@ ret:-EINVAL st: 0 flags:1 ts:-0.320000 · 1 unmodified line
66 ret:-EINVAL st:-1 flags:0 ts: 2.576668
77 ret:-EINVAL st:-1 flags:1 ts: 1.470835
88 ret: 0 st: 0 flags:0 ts: 0.360000
9−ret: 0 st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos: -1 size: 25312
9+ret: 0 st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos: -1 size: 25304
1010 ret:-EINVAL st: 0 flags:1 ts:-0.760000
1111 ret:-EINVAL st:-1 flags:0 ts: 2.153336
1212 ret:-EINVAL st:-1 flags:1 ts: 1.047503
@@ -18,7 +18,7 @@ ret:-EINVAL st: 0 flags:0 ts:-0.480000 · 5 unmodified lines
1818 ret:-EINVAL st: 0 flags:1 ts: 2.400000
1919 ret:-EINVAL st:-1 flags:0 ts: 1.306672
2020 ret: 0 st:-1 flags:1 ts: 0.200839
21−ret: 0 st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos: -1 size: 25799
21+ret: 0 st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos: -1 size: 25798
2222 ret:-EINVAL st: 0 flags:0 ts:-0.920000
2323 ret:-EINVAL st: 0 flags:1 ts: 2.000000
2424 ret:-EINVAL st:-1 flags:0 ts: 0.883340
@@ -26,5 +26,5 @@ ret:-EINVAL st:-1 flags:1 ts:-0.222493 · 1 unmodified line
2626 ret:-EINVAL st: 0 flags:0 ts: 2.680000
2727 ret:-EINVAL st: 0 flags:1 ts: 1.560000
2828 ret: 0 st:-1 flags:0 ts: 0.460008
29−ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: -1 size: 25489
29+ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: -1 size: 25488
3030 ret:-EINVAL st:-1 flags:1 ts:-0.645825
tests/ref/vsynth/vsynth1-mjpeg-422+2−2
@@ -1,4 +1,4 @@
1−eb0f7dc02efd5f4ab7ea3c73617801a3 *tests/data/fate/vsynth1-mjpeg-422.avi
2−1611674 tests/data/fate/vsynth1-mjpeg-422.avi
1+c3f2891bf340dc5bafde50feb236a55d *tests/data/fate/vsynth1-mjpeg-422.avi
2+1611442 tests/data/fate/vsynth1-mjpeg-422.avi
33 bc62d53cce32a595a0c6e9c318e4ce3e *tests/data/fate/vsynth1-mjpeg-422.out.rawvideo
44 stddev: 7.45 PSNR: 30.69 MAXDIFF: 63 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth1-mjpeg-444+2−2
@@ -1,4 +1,4 @@
1−bfde676dad356228f77aa319f046db8a *tests/data/fate/vsynth1-mjpeg-444.avi
2−1831606 tests/data/fate/vsynth1-mjpeg-444.avi
1+6df1ef3c72846b43b7bbaaed6272e433 *tests/data/fate/vsynth1-mjpeg-444.avi
2+1831046 tests/data/fate/vsynth1-mjpeg-444.avi
33 c51ee467d03242dfc1e4536b0485d00f *tests/data/fate/vsynth1-mjpeg-444.out.rawvideo
44 stddev: 7.37 PSNR: 30.77 MAXDIFF: 63 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth1-mjpeg-huffman+2−2
@@ -1,4 +1,4 @@
1−827f4da674de95b4227aadda8dbdaa77 *tests/data/fate/vsynth1-mjpeg-huffman.avi
2−1391436 tests/data/fate/vsynth1-mjpeg-huffman.avi
1+f42cd955597ade05b81c7e4b0fc35e5a *tests/data/fate/vsynth1-mjpeg-huffman.avi
2+1391116 tests/data/fate/vsynth1-mjpeg-huffman.avi
33 f46e58458ea57495a494650f7153829d *tests/data/fate/vsynth1-mjpeg-huffman.out.rawvideo
44 stddev: 7.87 PSNR: 30.21 MAXDIFF: 63 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth1-mjpeg-trell-huffman+2−2
@@ -1,4 +1,4 @@
1−e097a118dd37b3ab5607278d7b675ea3 *tests/data/fate/vsynth1-mjpeg-trell-huffman.avi
2−1361112 tests/data/fate/vsynth1-mjpeg-trell-huffman.avi
1+af1ed7a7536b2a84e8b91b2bbbfa4f9c *tests/data/fate/vsynth1-mjpeg-trell-huffman.avi
2+1360828 tests/data/fate/vsynth1-mjpeg-trell-huffman.avi
33 548de4f6098cbc3d8b65574bb93faf09 *tests/data/fate/vsynth1-mjpeg-trell-huffman.out.rawvideo
44 stddev: 7.67 PSNR: 30.42 MAXDIFF: 62 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth2-mjpeg-422+2−2
@@ -1,4 +1,4 @@
1−67a35df8ef714568db0362f4dce400fb *tests/data/fate/vsynth2-mjpeg-422.avi
2−877718 tests/data/fate/vsynth2-mjpeg-422.avi
1+d1e682a3468093c55b9579b5c2499b14 *tests/data/fate/vsynth2-mjpeg-422.avi
2+877194 tests/data/fate/vsynth2-mjpeg-422.avi
33 7fae296bb4290d09971a629040eac072 *tests/data/fate/vsynth2-mjpeg-422.out.rawvideo
44 stddev: 4.69 PSNR: 34.69 MAXDIFF: 55 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth2-mjpeg-444+2−2
@@ -1,4 +1,4 @@
1−24e04a6e3b645b3314e522cc6b4d3fb7 *tests/data/fate/vsynth2-mjpeg-444.avi
2−1005214 tests/data/fate/vsynth2-mjpeg-444.avi
1+b8d276c9017a3018266db3e35e8592df *tests/data/fate/vsynth2-mjpeg-444.avi
2+1004766 tests/data/fate/vsynth2-mjpeg-444.avi
33 fbeca59755dfb2b5e2f2c9781756d634 *tests/data/fate/vsynth2-mjpeg-444.out.rawvideo
44 stddev: 4.57 PSNR: 34.93 MAXDIFF: 55 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth2-mjpeg-huffman+2−2
@@ -1,4 +1,4 @@
1−2a959ad89469d88894d03dc9ce83e8b9 *tests/data/fate/vsynth2-mjpeg-huffman.avi
2−792950 tests/data/fate/vsynth2-mjpeg-huffman.avi
1+abca59bd27519877a448c508c046df46 *tests/data/fate/vsynth2-mjpeg-huffman.avi
2+792444 tests/data/fate/vsynth2-mjpeg-huffman.avi
33 fe498d9edaa947e435e4f353c194ef3d *tests/data/fate/vsynth2-mjpeg-huffman.out.rawvideo
44 stddev: 4.87 PSNR: 34.37 MAXDIFF: 55 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth2-mjpeg-trell-huffman+2−2
@@ -1,4 +1,4 @@
1−d6a09ff8a46c297934496d8089cdd2a2 *tests/data/fate/vsynth2-mjpeg-trell-huffman.avi
2−734896 tests/data/fate/vsynth2-mjpeg-trell-huffman.avi
1+d16eaa6ece27bc10715f24509334c402 *tests/data/fate/vsynth2-mjpeg-trell-huffman.avi
2+734736 tests/data/fate/vsynth2-mjpeg-trell-huffman.avi
33 8612dfee87e32268f6f533188a097785 *tests/data/fate/vsynth2-mjpeg-trell-huffman.out.rawvideo
44 stddev: 5.03 PSNR: 34.10 MAXDIFF: 67 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth3-mjpeg-422+2−2
@@ -1,4 +1,4 @@
1−9aa0f90dac7ef923a0be0d93ca7dc039 *tests/data/fate/vsynth3-mjpeg-422.avi
2−52620 tests/data/fate/vsynth3-mjpeg-422.avi
1+9377167f1597b9b2d0e3a8abb5244eba *tests/data/fate/vsynth3-mjpeg-422.avi
2+52614 tests/data/fate/vsynth3-mjpeg-422.avi
33 7c64ab866add1e59fe7c34feed006df1 *tests/data/fate/vsynth3-mjpeg-422.out.rawvideo
44 stddev: 8.22 PSNR: 29.82 MAXDIFF: 58 bytes: 86700/ 86700
tests/ref/vsynth/vsynth3-mjpeg-444+2−2
@@ -1,4 +1,4 @@
1−c063ea1cddfc2a360b92f05d1811ea93 *tests/data/fate/vsynth3-mjpeg-444.avi
2−53954 tests/data/fate/vsynth3-mjpeg-444.avi
1+ff215eb039c4d2ef34b891c25ffe0fbd *tests/data/fate/vsynth3-mjpeg-444.avi
2+53958 tests/data/fate/vsynth3-mjpeg-444.avi
33 8bbbfeab8b3f6788719e1f0f77ce8612 *tests/data/fate/vsynth3-mjpeg-444.out.rawvideo
44 stddev: 8.21 PSNR: 29.84 MAXDIFF: 58 bytes: 86700/ 86700
tests/ref/vsynth/vsynth3-mjpeg-huffman+2−2
@@ -1,4 +1,4 @@
1−62a7732fcb9288a7223671b23ce06fa0 *tests/data/fate/vsynth3-mjpeg-huffman.avi
2−48170 tests/data/fate/vsynth3-mjpeg-huffman.avi
1+52b7c3884957ac81fe1b8e1ecf40827b *tests/data/fate/vsynth3-mjpeg-huffman.avi
2+48152 tests/data/fate/vsynth3-mjpeg-huffman.avi
33 a6daba607898eb6e1a172c2368084a67 *tests/data/fate/vsynth3-mjpeg-huffman.out.rawvideo
44 stddev: 8.61 PSNR: 29.43 MAXDIFF: 58 bytes: 86700/ 86700
tests/ref/vsynth/vsynth3-mjpeg-trell-huffman+1−1
@@ -1,4 +1,4 @@
1−7cbc02d85a572b5ea871c014ce27ab4c *tests/data/fate/vsynth3-mjpeg-trell-huffman.avi
1+fcfa06df101f91ac19793dc90c4c918c *tests/data/fate/vsynth3-mjpeg-trell-huffman.avi
22 47834 tests/data/fate/vsynth3-mjpeg-trell-huffman.avi
33 07822517628b20d54621df666ea79af3 *tests/data/fate/vsynth3-mjpeg-trell-huffman.out.rawvideo
44 stddev: 8.27 PSNR: 29.78 MAXDIFF: 55 bytes: 86700/ 86700
tests/ref/vsynth/vsynth_lena-mjpeg-422+2−2
@@ -1,4 +1,4 @@
1−494812cc00c2d51df2d9cbc03dc9eecd *tests/data/fate/vsynth_lena-mjpeg-422.avi
2−707466 tests/data/fate/vsynth_lena-mjpeg-422.avi
1+778be0c8ee9c030aa2838bf249874082 *tests/data/fate/vsynth_lena-mjpeg-422.avi
2+707170 tests/data/fate/vsynth_lena-mjpeg-422.avi
33 16d2be35266d303dff3361e4535e8dd8 *tests/data/fate/vsynth_lena-mjpeg-422.out.rawvideo
44 stddev: 4.18 PSNR: 35.70 MAXDIFF: 49 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth_lena-mjpeg-444+2−2
@@ -1,4 +1,4 @@
1−52996e606d20fe34c327a206be066091 *tests/data/fate/vsynth_lena-mjpeg-444.avi
2−807472 tests/data/fate/vsynth_lena-mjpeg-444.avi
1+a48b1f2d17264bce552cfcd920df1ea9 *tests/data/fate/vsynth_lena-mjpeg-444.avi
2+807190 tests/data/fate/vsynth_lena-mjpeg-444.avi
33 0db1c1942d750b107acf2acfbe08eacb *tests/data/fate/vsynth_lena-mjpeg-444.out.rawvideo
44 stddev: 4.05 PSNR: 35.96 MAXDIFF: 49 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth_lena-mjpeg-huffman+2−2
@@ -1,4 +1,4 @@
1−d8b968d6ecaa83bb120eb0dd08c3f6df *tests/data/fate/vsynth_lena-mjpeg-huffman.avi
2−635642 tests/data/fate/vsynth_lena-mjpeg-huffman.avi
1+80bf47172b96ad68be829c4f46073299 *tests/data/fate/vsynth_lena-mjpeg-huffman.avi
2+635256 tests/data/fate/vsynth_lena-mjpeg-huffman.avi
33 095f88a721813c2a1c34b26303c1139a *tests/data/fate/vsynth_lena-mjpeg-huffman.out.rawvideo
44 stddev: 4.33 PSNR: 35.40 MAXDIFF: 49 bytes: 7603200/ 7603200
tests/ref/vsynth/vsynth_lena-mjpeg-trell-huffman+2−2
@@ -1,4 +1,4 @@
1−8217aef7ee16709b2c0591a9a28d9bb8 *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi
2−582648 tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi
1+dc66c0700d50235965fd3fabdcb9a214 *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi
2+582552 tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi
33 8c5c05e82a959ccc8b3c4ba8e4123bbe *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.out.rawvideo
44 stddev: 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