1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

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).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-04-02 15:06:43 +02:00
parent c8ce9de5a0
commit ff9f3fb607
22 changed files with 118 additions and 133 deletions

View File

@ -43,14 +43,6 @@ typedef struct PackageMergerList {
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 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
} PackageMergerList; } PackageMergerList;
/**
* Used to store optimal huffman encoding results
*/
typedef struct HuffTable {
int code; ///< code is the input value
int length; ///< length of the encoding
} HuffTable;
/** /**
* Comparison function for two PTables by prob * Comparison function for two PTables by prob
* *
@ -65,20 +57,6 @@ static int compare_by_prob(const void *a, const void *b)
return a_val.prob - b_val.prob; return a_val.prob - b_val.prob;
} }
/**
* Comparison function for two HuffTables by length
*
* @param a First HuffTable to compare
* @param b Second HuffTable to compare
* @return < 0 for less than, 0 for equals, > 0 for greater than
*/
static int compare_by_length(const void *a, const void *b)
{
HuffTable a_val = *(HuffTable *) a;
HuffTable b_val = *(HuffTable *) b;
return a_val.length - b_val.length;
}
/** /**
* Computes the length of the Huffman encoding for each distinct input value. * Computes the length of the Huffman encoding for each distinct input value.
* Uses package merge algorithm as follows: * Uses package merge algorithm as follows:
@ -92,15 +70,16 @@ static int compare_by_length(const void *a, const void *b)
* 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 * 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
* Go to guru.multimedia.cx/small-tasks-for-ffmpeg/ for more details * Go to guru.multimedia.cx/small-tasks-for-ffmpeg/ for more details
* *
* All probabilities should be positive integers. The output is sorted by code, * All probabilities should be nonnegative integers.
* not by length.
* *
* @param prob_table input array of a PTable for each distinct input value * @param prob_table[in,out] array of a PTable for each distinct input value,
* @param distincts output array of a HuffTable that will be populated by this function * will be sorted according to ascending probability
* @param size size of the prob_table array * @param counts[out] the number of values of a given length
* @param max_length max length of an encoding * @param size number of elements of the prob_table array
* @param max_length max length of a code
*/ */
static void mjpegenc_huffman_compute_bits(PTable *prob_table, HuffTable *distincts, static void mjpegenc_huffman_compute_bits(PTable *prob_table,
uint8_t counts[/* max_length + 1 */],
int size, int max_length) int size, int max_length)
{ {
PackageMergerList list_a, list_b, *to = &list_a, *from = &list_b, *temp; 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
} }
// we don't want to return the 256 bit count (it was just in here to prevent // we don't want to return the 256 bit count (it was just in here to prevent
// all 1s encoding) // all 1s encoding)
j = 0; memset(counts, 0, sizeof(counts[0]) * (max_length + 1));
for (i = 0; i < 256; i++) { for (int i = 0; i < 256; ++i)
if (nbits[i] > 0) { counts[nbits[i]]++;
distincts[j].code = i;
distincts[j].length = nbits[i];
j++;
}
}
} }
void ff_mjpeg_encode_huffman_init(MJpegEncHuffmanContext *s) void ff_mjpeg_encode_huffman_init(MJpegEncHuffmanContext *s)
@ -186,7 +160,6 @@ void ff_mjpeg_encode_huffman_close(MJpegEncHuffmanContext *s, uint8_t bits[17],
uint8_t val[], int max_nval) uint8_t val[], int max_nval)
{ {
PTable val_counts[257]; PTable val_counts[257];
HuffTable distincts[256];
av_assert1(max_nval <= FF_ARRAY_ELEMS(val_counts) - 1); av_assert1(max_nval <= FF_ARRAY_ELEMS(val_counts) - 1);
@ -201,12 +174,13 @@ void ff_mjpeg_encode_huffman_close(MJpegEncHuffmanContext *s, uint8_t bits[17],
} }
val_counts[nval].value = 256; val_counts[nval].value = 256;
val_counts[nval].prob = 0; val_counts[nval].prob = 0;
mjpegenc_huffman_compute_bits(val_counts, distincts, nval + 1, 16);
AV_QSORT(distincts, nval, HuffTable, compare_by_length);
memset(bits, 0, sizeof(bits[0]) * 17); mjpegenc_huffman_compute_bits(val_counts, bits, nval + 1, 16);
for (int i = 0; i < nval; i++) {
val[i] = distincts[i].code; // val_counts[0] is the fake element we added earlier.
bits[distincts[i].length]++; av_assert1(val_counts[0].prob == 0 && val_counts[0].value == 256);
} // The following loop puts the values with higher occurence first,
// ensuring that they get the shorter codes.
for (int i = 0; i < nval; ++i)
val[i] = val_counts[nval - i].value;
} }

View File

@ -34,10 +34,9 @@
static int check_lengths(int L, const int *probs, int nprobs, static int check_lengths(int L, const int *probs, int nprobs,
int expected_length, const uint8_t expected_len_counts[/* L + 1 */]) int expected_length, const uint8_t expected_len_counts[/* L + 1 */])
{ {
HuffTable lengths[256];
PTable val_counts[256]; PTable val_counts[256];
uint8_t len_counts[17] = { 0 }; uint8_t len_counts[17];
int actual_length = 0, i, j, k, prob, length; int actual_length = 0, i;
int ret = 0; int ret = 0;
av_assert0(nprobs <= 256); av_assert0(nprobs <= 256);
av_assert0(L < FF_ARRAY_ELEMS(len_counts)); av_assert0(L < FF_ARRAY_ELEMS(len_counts));
@ -46,20 +45,12 @@ static int check_lengths(int L, const int *probs, int nprobs,
val_counts[i] = (PTable){.value = i, .prob = probs[i]}; val_counts[i] = (PTable){.value = i, .prob = probs[i]};
} }
mjpegenc_huffman_compute_bits(val_counts, lengths, nprobs, L); mjpegenc_huffman_compute_bits(val_counts, len_counts, nprobs, L);
for (int i = 0; i < nprobs; ++i) {
if (lengths[i].length > L) {
fprintf(stderr,
"Len %d of element %d of Huffman table with %d elements exceeds max length %d\n",
lengths[i].length, i, nprobs, L);
return 1;
}
len_counts[lengths[i].length]++;
}
// Test that the lengths can be made part of a complete, prefix-free tree: // Test that the lengths can be made part of a complete, prefix-free tree:
unsigned code = 0; unsigned code = 0, count = 0;
for (int i = 1; i <= L; ++i) { for (int i = 1; i <= L; ++i) {
count += len_counts[i];
code <<= 1; code <<= 1;
code += len_counts[i]; code += len_counts[i];
} }
@ -67,22 +58,36 @@ static int check_lengths(int L, const int *probs, int nprobs,
fprintf(stderr, "Huffman tree overdetermined/invalid\n"); fprintf(stderr, "Huffman tree overdetermined/invalid\n");
ret = 1; ret = 1;
} }
if (count != nprobs) {
for (i = 0; i < nprobs; i++) { fprintf(stderr, "Total count %u does not match expected value %d\n",
// Find the value's prob and length count, nprobs);
for (j = 0; j < nprobs; j++) ret = 1;
if (val_counts[j].value == i) break; }
for (k = 0; k < nprobs; k++) // Test that the input values have been properly ordered.
if (lengths[k].code == i) break; for (unsigned i = 0; i < count; ++i) {
if (!(j < nprobs && k < nprobs)) return 1; if (val_counts[i].prob != probs[val_counts[i].value]) {
prob = val_counts[j].prob; fprintf(stderr, "PTable not properly reordered\n");
length = lengths[k].length; ret = 1;
if (prob) {
actual_length += prob * length;
} }
if (i && val_counts[i - 1].prob > val_counts[i].prob) {
if (length > L || length < 1) return 1; fprintf(stderr, "PTable not order ascendingly: [%u] = %d > [%u] = %d\n",
i - 1, val_counts[i - 1].prob, i, val_counts[i].prob);
ret = 1;
}
unsigned j;
for (j = 0; j < count; ++j)
if (val_counts[j].value == i)
break;
if (j >= count) {
fprintf(stderr, "Element %u missing after sorting\n", i);
ret = 1;
}
}
for (int len = L, j = 0; len; --len) {
int prob = 0;
for (int end = j + len_counts[len]; j < end; ++j)
prob += val_counts[j].prob;
actual_length += prob * len;
} }
// Check that the total length is optimal // Check that the total length is optimal
if (actual_length != expected_length) ret = 1; if (actual_length != expected_length) ret = 1;
@ -141,7 +146,10 @@ static const uint8_t len_counts_sat[] = {
// http://guru.multimedia.cx/small-tasks-for-ffmpeg/ // http://guru.multimedia.cx/small-tasks-for-ffmpeg/
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int i, ret = 0; enum {
MAX_LEN = 3,
};
int ret = 0;
// Probabilities of symbols 0..4 // Probabilities of symbols 0..4
PTable val_counts[] = { PTable val_counts[] = {
{.value = 0, .prob = 1}, {.value = 0, .prob = 1},
@ -151,30 +159,33 @@ int main(int argc, char **argv)
{.value = 4, .prob = 21}, {.value = 4, .prob = 21},
}; };
// Expected code lengths for each symbol // Expected code lengths for each symbol
static const HuffTable expected[] = { static const uint8_t expected[MAX_LEN + 1] = {
{.code = 0, .length = 3}, [1] = 1, [3] = 4,
{.code = 1, .length = 3},
{.code = 2, .length = 3},
{.code = 3, .length = 3},
{.code = 4, .length = 1},
}; };
// Actual code lengths // Actual code lengths
HuffTable distincts[5]; uint8_t len_counts[MAX_LEN + 1];
// Build optimal huffman tree using an internal function, to allow for // Build optimal huffman tree using an internal function, to allow for
// smaller-than-normal test cases. This mutates val_counts by sorting. // smaller-than-normal test cases. This mutates val_counts by sorting.
mjpegenc_huffman_compute_bits(val_counts, distincts, mjpegenc_huffman_compute_bits(val_counts, len_counts,
FF_ARRAY_ELEMS(distincts), 3); FF_ARRAY_ELEMS(val_counts), MAX_LEN);
for (i = 0; i < FF_ARRAY_ELEMS(distincts); i++) { for (unsigned i = 1; i < FF_ARRAY_ELEMS(len_counts); i++) {
if (distincts[i].code != expected[i].code || if (len_counts[i] != expected[i]) {
distincts[i].length != expected[i].length) {
fprintf(stderr, fprintf(stderr,
"Built huffman does not equal expectations. " "Built huffman does not equal expectations. "
"Expected: code %d probability %d, " "Expected: %d codes of length %u, "
"Actual: code %d probability %d\n", "Actual: %d codes of length %u\n",
expected[i].code, expected[i].length, (int)expected[i], i,
distincts[i].code, distincts[i].length); (int)len_counts[i], i);
ret = 1;
}
}
for (unsigned i = 1; i < FF_ARRAY_ELEMS(val_counts); ++i) {
if (val_counts[i - 1].prob > val_counts[i].prob) {
fprintf(stderr, "Probability table not ordered ascendingly. "
"val_counts[%u] == %d, val_counts[%u] == %d\n",
i - 1, val_counts[i - 1].prob, i, val_counts[i].prob);
ret = 1; ret = 1;
} }
} }

View File

@ -1,5 +1,5 @@
5c83d22a628d01c095704f58328f63c9 *tests/data/fate/jpg-icc.mjpeg 4d8f3d93f55267cc90bd1d2a94cfa84f *tests/data/fate/jpg-icc.mjpeg
11016 tests/data/fate/jpg-icc.mjpeg 11011 tests/data/fate/jpg-icc.mjpeg
#tb 0: 1/25 #tb 0: 1/25
#media_type 0: video #media_type 0: video
#codec_id 0: rawvideo #codec_id 0: rawvideo
@ -19,7 +19,7 @@ best_effort_timestamp_time=0.000000
duration=1 duration=1
duration_time=0.040000 duration_time=0.040000
pkt_pos=0 pkt_pos=0
pkt_size=11016 pkt_size=11011
width=128 width=128
height=128 height=128
crop_top=0 crop_top=0

View File

@ -1,3 +1,3 @@
64885ae70c3450b50196ce687a672dbe *tests/data/images/jpg/02.jpg c7b9382883d021b6535096f58d83c72c *tests/data/images/jpg/02.jpg
26062 tests/data/images/jpg/02.jpg 26057 tests/data/images/jpg/02.jpg
tests/data/images/jpg/%02d.jpg CRC=0x1c357a3e tests/data/images/jpg/%02d.jpg CRC=0x1c357a3e

View File

@ -1,3 +1,3 @@
659757345ce01f8a5c4c1373bd073d41 *tests/data/lavf/lavf.smjpeg 9278aa4b2eafa6b863fc6085b43abd8d *tests/data/lavf/lavf.smjpeg
728268 tests/data/lavf/lavf.smjpeg 728177 tests/data/lavf/lavf.smjpeg
tests/data/lavf/lavf.smjpeg CRC=0x29d58fb8 tests/data/lavf/lavf.smjpeg CRC=0x29d58fb8

View File

@ -1,4 +1,4 @@
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: -1 size: 25633 ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: -1 size: 25629
ret:-EINVAL st:-1 flags:0 ts:-1.000000 ret:-EINVAL st:-1 flags:0 ts:-1.000000
ret:-EINVAL st:-1 flags:1 ts: 1.894167 ret:-EINVAL st:-1 flags:1 ts: 1.894167
ret:-EINVAL st: 0 flags:0 ts: 0.800000 ret:-EINVAL st: 0 flags:0 ts: 0.800000
@ -6,7 +6,7 @@ ret:-EINVAL st: 0 flags:1 ts:-0.320000
ret:-EINVAL st:-1 flags:0 ts: 2.576668 ret:-EINVAL st:-1 flags:0 ts: 2.576668
ret:-EINVAL st:-1 flags:1 ts: 1.470835 ret:-EINVAL st:-1 flags:1 ts: 1.470835
ret: 0 st: 0 flags:0 ts: 0.360000 ret: 0 st: 0 flags:0 ts: 0.360000
ret: 0 st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos: -1 size: 25312 ret: 0 st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos: -1 size: 25304
ret:-EINVAL st: 0 flags:1 ts:-0.760000 ret:-EINVAL st: 0 flags:1 ts:-0.760000
ret:-EINVAL st:-1 flags:0 ts: 2.153336 ret:-EINVAL st:-1 flags:0 ts: 2.153336
ret:-EINVAL st:-1 flags:1 ts: 1.047503 ret:-EINVAL st:-1 flags:1 ts: 1.047503
@ -18,7 +18,7 @@ ret:-EINVAL st: 0 flags:0 ts:-0.480000
ret:-EINVAL st: 0 flags:1 ts: 2.400000 ret:-EINVAL st: 0 flags:1 ts: 2.400000
ret:-EINVAL st:-1 flags:0 ts: 1.306672 ret:-EINVAL st:-1 flags:0 ts: 1.306672
ret: 0 st:-1 flags:1 ts: 0.200839 ret: 0 st:-1 flags:1 ts: 0.200839
ret: 0 st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos: -1 size: 25799 ret: 0 st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos: -1 size: 25798
ret:-EINVAL st: 0 flags:0 ts:-0.920000 ret:-EINVAL st: 0 flags:0 ts:-0.920000
ret:-EINVAL st: 0 flags:1 ts: 2.000000 ret:-EINVAL st: 0 flags:1 ts: 2.000000
ret:-EINVAL st:-1 flags:0 ts: 0.883340 ret:-EINVAL st:-1 flags:0 ts: 0.883340
@ -26,5 +26,5 @@ ret:-EINVAL st:-1 flags:1 ts:-0.222493
ret:-EINVAL st: 0 flags:0 ts: 2.680000 ret:-EINVAL st: 0 flags:0 ts: 2.680000
ret:-EINVAL st: 0 flags:1 ts: 1.560000 ret:-EINVAL st: 0 flags:1 ts: 1.560000
ret: 0 st:-1 flags:0 ts: 0.460008 ret: 0 st:-1 flags:0 ts: 0.460008
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: -1 size: 25489 ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: -1 size: 25488
ret:-EINVAL st:-1 flags:1 ts:-0.645825 ret:-EINVAL st:-1 flags:1 ts:-0.645825

View File

@ -1,4 +1,4 @@
eb0f7dc02efd5f4ab7ea3c73617801a3 *tests/data/fate/vsynth1-mjpeg-422.avi c3f2891bf340dc5bafde50feb236a55d *tests/data/fate/vsynth1-mjpeg-422.avi
1611674 tests/data/fate/vsynth1-mjpeg-422.avi 1611442 tests/data/fate/vsynth1-mjpeg-422.avi
bc62d53cce32a595a0c6e9c318e4ce3e *tests/data/fate/vsynth1-mjpeg-422.out.rawvideo bc62d53cce32a595a0c6e9c318e4ce3e *tests/data/fate/vsynth1-mjpeg-422.out.rawvideo
stddev: 7.45 PSNR: 30.69 MAXDIFF: 63 bytes: 7603200/ 7603200 stddev: 7.45 PSNR: 30.69 MAXDIFF: 63 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
bfde676dad356228f77aa319f046db8a *tests/data/fate/vsynth1-mjpeg-444.avi 6df1ef3c72846b43b7bbaaed6272e433 *tests/data/fate/vsynth1-mjpeg-444.avi
1831606 tests/data/fate/vsynth1-mjpeg-444.avi 1831046 tests/data/fate/vsynth1-mjpeg-444.avi
c51ee467d03242dfc1e4536b0485d00f *tests/data/fate/vsynth1-mjpeg-444.out.rawvideo c51ee467d03242dfc1e4536b0485d00f *tests/data/fate/vsynth1-mjpeg-444.out.rawvideo
stddev: 7.37 PSNR: 30.77 MAXDIFF: 63 bytes: 7603200/ 7603200 stddev: 7.37 PSNR: 30.77 MAXDIFF: 63 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
827f4da674de95b4227aadda8dbdaa77 *tests/data/fate/vsynth1-mjpeg-huffman.avi f42cd955597ade05b81c7e4b0fc35e5a *tests/data/fate/vsynth1-mjpeg-huffman.avi
1391436 tests/data/fate/vsynth1-mjpeg-huffman.avi 1391116 tests/data/fate/vsynth1-mjpeg-huffman.avi
f46e58458ea57495a494650f7153829d *tests/data/fate/vsynth1-mjpeg-huffman.out.rawvideo f46e58458ea57495a494650f7153829d *tests/data/fate/vsynth1-mjpeg-huffman.out.rawvideo
stddev: 7.87 PSNR: 30.21 MAXDIFF: 63 bytes: 7603200/ 7603200 stddev: 7.87 PSNR: 30.21 MAXDIFF: 63 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
e097a118dd37b3ab5607278d7b675ea3 *tests/data/fate/vsynth1-mjpeg-trell-huffman.avi af1ed7a7536b2a84e8b91b2bbbfa4f9c *tests/data/fate/vsynth1-mjpeg-trell-huffman.avi
1361112 tests/data/fate/vsynth1-mjpeg-trell-huffman.avi 1360828 tests/data/fate/vsynth1-mjpeg-trell-huffman.avi
548de4f6098cbc3d8b65574bb93faf09 *tests/data/fate/vsynth1-mjpeg-trell-huffman.out.rawvideo 548de4f6098cbc3d8b65574bb93faf09 *tests/data/fate/vsynth1-mjpeg-trell-huffman.out.rawvideo
stddev: 7.67 PSNR: 30.42 MAXDIFF: 62 bytes: 7603200/ 7603200 stddev: 7.67 PSNR: 30.42 MAXDIFF: 62 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
67a35df8ef714568db0362f4dce400fb *tests/data/fate/vsynth2-mjpeg-422.avi d1e682a3468093c55b9579b5c2499b14 *tests/data/fate/vsynth2-mjpeg-422.avi
877718 tests/data/fate/vsynth2-mjpeg-422.avi 877194 tests/data/fate/vsynth2-mjpeg-422.avi
7fae296bb4290d09971a629040eac072 *tests/data/fate/vsynth2-mjpeg-422.out.rawvideo 7fae296bb4290d09971a629040eac072 *tests/data/fate/vsynth2-mjpeg-422.out.rawvideo
stddev: 4.69 PSNR: 34.69 MAXDIFF: 55 bytes: 7603200/ 7603200 stddev: 4.69 PSNR: 34.69 MAXDIFF: 55 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
24e04a6e3b645b3314e522cc6b4d3fb7 *tests/data/fate/vsynth2-mjpeg-444.avi b8d276c9017a3018266db3e35e8592df *tests/data/fate/vsynth2-mjpeg-444.avi
1005214 tests/data/fate/vsynth2-mjpeg-444.avi 1004766 tests/data/fate/vsynth2-mjpeg-444.avi
fbeca59755dfb2b5e2f2c9781756d634 *tests/data/fate/vsynth2-mjpeg-444.out.rawvideo fbeca59755dfb2b5e2f2c9781756d634 *tests/data/fate/vsynth2-mjpeg-444.out.rawvideo
stddev: 4.57 PSNR: 34.93 MAXDIFF: 55 bytes: 7603200/ 7603200 stddev: 4.57 PSNR: 34.93 MAXDIFF: 55 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
2a959ad89469d88894d03dc9ce83e8b9 *tests/data/fate/vsynth2-mjpeg-huffman.avi abca59bd27519877a448c508c046df46 *tests/data/fate/vsynth2-mjpeg-huffman.avi
792950 tests/data/fate/vsynth2-mjpeg-huffman.avi 792444 tests/data/fate/vsynth2-mjpeg-huffman.avi
fe498d9edaa947e435e4f353c194ef3d *tests/data/fate/vsynth2-mjpeg-huffman.out.rawvideo fe498d9edaa947e435e4f353c194ef3d *tests/data/fate/vsynth2-mjpeg-huffman.out.rawvideo
stddev: 4.87 PSNR: 34.37 MAXDIFF: 55 bytes: 7603200/ 7603200 stddev: 4.87 PSNR: 34.37 MAXDIFF: 55 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
d6a09ff8a46c297934496d8089cdd2a2 *tests/data/fate/vsynth2-mjpeg-trell-huffman.avi d16eaa6ece27bc10715f24509334c402 *tests/data/fate/vsynth2-mjpeg-trell-huffman.avi
734896 tests/data/fate/vsynth2-mjpeg-trell-huffman.avi 734736 tests/data/fate/vsynth2-mjpeg-trell-huffman.avi
8612dfee87e32268f6f533188a097785 *tests/data/fate/vsynth2-mjpeg-trell-huffman.out.rawvideo 8612dfee87e32268f6f533188a097785 *tests/data/fate/vsynth2-mjpeg-trell-huffman.out.rawvideo
stddev: 5.03 PSNR: 34.10 MAXDIFF: 67 bytes: 7603200/ 7603200 stddev: 5.03 PSNR: 34.10 MAXDIFF: 67 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
9aa0f90dac7ef923a0be0d93ca7dc039 *tests/data/fate/vsynth3-mjpeg-422.avi 9377167f1597b9b2d0e3a8abb5244eba *tests/data/fate/vsynth3-mjpeg-422.avi
52620 tests/data/fate/vsynth3-mjpeg-422.avi 52614 tests/data/fate/vsynth3-mjpeg-422.avi
7c64ab866add1e59fe7c34feed006df1 *tests/data/fate/vsynth3-mjpeg-422.out.rawvideo 7c64ab866add1e59fe7c34feed006df1 *tests/data/fate/vsynth3-mjpeg-422.out.rawvideo
stddev: 8.22 PSNR: 29.82 MAXDIFF: 58 bytes: 86700/ 86700 stddev: 8.22 PSNR: 29.82 MAXDIFF: 58 bytes: 86700/ 86700

View File

@ -1,4 +1,4 @@
c063ea1cddfc2a360b92f05d1811ea93 *tests/data/fate/vsynth3-mjpeg-444.avi ff215eb039c4d2ef34b891c25ffe0fbd *tests/data/fate/vsynth3-mjpeg-444.avi
53954 tests/data/fate/vsynth3-mjpeg-444.avi 53958 tests/data/fate/vsynth3-mjpeg-444.avi
8bbbfeab8b3f6788719e1f0f77ce8612 *tests/data/fate/vsynth3-mjpeg-444.out.rawvideo 8bbbfeab8b3f6788719e1f0f77ce8612 *tests/data/fate/vsynth3-mjpeg-444.out.rawvideo
stddev: 8.21 PSNR: 29.84 MAXDIFF: 58 bytes: 86700/ 86700 stddev: 8.21 PSNR: 29.84 MAXDIFF: 58 bytes: 86700/ 86700

View File

@ -1,4 +1,4 @@
62a7732fcb9288a7223671b23ce06fa0 *tests/data/fate/vsynth3-mjpeg-huffman.avi 52b7c3884957ac81fe1b8e1ecf40827b *tests/data/fate/vsynth3-mjpeg-huffman.avi
48170 tests/data/fate/vsynth3-mjpeg-huffman.avi 48152 tests/data/fate/vsynth3-mjpeg-huffman.avi
a6daba607898eb6e1a172c2368084a67 *tests/data/fate/vsynth3-mjpeg-huffman.out.rawvideo a6daba607898eb6e1a172c2368084a67 *tests/data/fate/vsynth3-mjpeg-huffman.out.rawvideo
stddev: 8.61 PSNR: 29.43 MAXDIFF: 58 bytes: 86700/ 86700 stddev: 8.61 PSNR: 29.43 MAXDIFF: 58 bytes: 86700/ 86700

View File

@ -1,4 +1,4 @@
7cbc02d85a572b5ea871c014ce27ab4c *tests/data/fate/vsynth3-mjpeg-trell-huffman.avi fcfa06df101f91ac19793dc90c4c918c *tests/data/fate/vsynth3-mjpeg-trell-huffman.avi
47834 tests/data/fate/vsynth3-mjpeg-trell-huffman.avi 47834 tests/data/fate/vsynth3-mjpeg-trell-huffman.avi
07822517628b20d54621df666ea79af3 *tests/data/fate/vsynth3-mjpeg-trell-huffman.out.rawvideo 07822517628b20d54621df666ea79af3 *tests/data/fate/vsynth3-mjpeg-trell-huffman.out.rawvideo
stddev: 8.27 PSNR: 29.78 MAXDIFF: 55 bytes: 86700/ 86700 stddev: 8.27 PSNR: 29.78 MAXDIFF: 55 bytes: 86700/ 86700

View File

@ -1,4 +1,4 @@
494812cc00c2d51df2d9cbc03dc9eecd *tests/data/fate/vsynth_lena-mjpeg-422.avi 778be0c8ee9c030aa2838bf249874082 *tests/data/fate/vsynth_lena-mjpeg-422.avi
707466 tests/data/fate/vsynth_lena-mjpeg-422.avi 707170 tests/data/fate/vsynth_lena-mjpeg-422.avi
16d2be35266d303dff3361e4535e8dd8 *tests/data/fate/vsynth_lena-mjpeg-422.out.rawvideo 16d2be35266d303dff3361e4535e8dd8 *tests/data/fate/vsynth_lena-mjpeg-422.out.rawvideo
stddev: 4.18 PSNR: 35.70 MAXDIFF: 49 bytes: 7603200/ 7603200 stddev: 4.18 PSNR: 35.70 MAXDIFF: 49 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
52996e606d20fe34c327a206be066091 *tests/data/fate/vsynth_lena-mjpeg-444.avi a48b1f2d17264bce552cfcd920df1ea9 *tests/data/fate/vsynth_lena-mjpeg-444.avi
807472 tests/data/fate/vsynth_lena-mjpeg-444.avi 807190 tests/data/fate/vsynth_lena-mjpeg-444.avi
0db1c1942d750b107acf2acfbe08eacb *tests/data/fate/vsynth_lena-mjpeg-444.out.rawvideo 0db1c1942d750b107acf2acfbe08eacb *tests/data/fate/vsynth_lena-mjpeg-444.out.rawvideo
stddev: 4.05 PSNR: 35.96 MAXDIFF: 49 bytes: 7603200/ 7603200 stddev: 4.05 PSNR: 35.96 MAXDIFF: 49 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
d8b968d6ecaa83bb120eb0dd08c3f6df *tests/data/fate/vsynth_lena-mjpeg-huffman.avi 80bf47172b96ad68be829c4f46073299 *tests/data/fate/vsynth_lena-mjpeg-huffman.avi
635642 tests/data/fate/vsynth_lena-mjpeg-huffman.avi 635256 tests/data/fate/vsynth_lena-mjpeg-huffman.avi
095f88a721813c2a1c34b26303c1139a *tests/data/fate/vsynth_lena-mjpeg-huffman.out.rawvideo 095f88a721813c2a1c34b26303c1139a *tests/data/fate/vsynth_lena-mjpeg-huffman.out.rawvideo
stddev: 4.33 PSNR: 35.40 MAXDIFF: 49 bytes: 7603200/ 7603200 stddev: 4.33 PSNR: 35.40 MAXDIFF: 49 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
8217aef7ee16709b2c0591a9a28d9bb8 *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi dc66c0700d50235965fd3fabdcb9a214 *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi
582648 tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi 582552 tests/data/fate/vsynth_lena-mjpeg-trell-huffman.avi
8c5c05e82a959ccc8b3c4ba8e4123bbe *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.out.rawvideo 8c5c05e82a959ccc8b3c4ba8e4123bbe *tests/data/fate/vsynth_lena-mjpeg-trell-huffman.out.rawvideo
stddev: 4.51 PSNR: 35.04 MAXDIFF: 60 bytes: 7603200/ 7603200 stddev: 4.51 PSNR: 35.04 MAXDIFF: 60 bytes: 7603200/ 7603200