exp-golomb.test.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. ======== A Handy Little QUnit Reference ========
  3. http://api.qunitjs.com/
  4. Test methods:
  5. module(name, {[setup][ ,teardown]})
  6. test(name, callback)
  7. expect(numberOfAssertions)
  8. stop(increment)
  9. start(decrement)
  10. Test assertions:
  11. assert.ok(value, [message])
  12. assert.equal(actual, expected, [message])
  13. assert.notEqual(actual, expected, [message])
  14. assert.deepEqual(actual, expected, [message])
  15. assert.notDeepEqual(actual, expected, [message])
  16. assert.strictEqual(actual, expected, [message])
  17. assert.notStrictEqual(actual, expected, [message])
  18. assert.throws(block, [expected], [message])
  19. */
  20. var
  21. buffer,
  22. ExpGolomb = require('../lib/utils/exp-golomb'),
  23. expGolomb;
  24. QUnit.module('Exponential Golomb coding');
  25. QUnit.test('small numbers are coded correctly', function(assert) {
  26. var
  27. expected = [
  28. [0xF8, 0],
  29. [0x5F, 1],
  30. [0x7F, 2],
  31. [0x27, 3],
  32. [0x2F, 4],
  33. [0x37, 5],
  34. [0x3F, 6],
  35. [0x11, 7],
  36. [0x13, 8],
  37. [0x15, 9]
  38. ],
  39. i = expected.length,
  40. result;
  41. while (i--) {
  42. buffer = new Uint8Array([expected[i][0]]);
  43. expGolomb = new ExpGolomb(buffer);
  44. result = expGolomb.readUnsignedExpGolomb();
  45. assert.equal(expected[i][1], result, expected[i][0] + ' is decoded to ' + expected[i][1]);
  46. }
  47. });
  48. QUnit.test('drops working data as it is parsed', function(assert) {
  49. var expGolomb = new ExpGolomb(new Uint8Array([0x00, 0xFF]));
  50. expGolomb.skipBits(8);
  51. assert.equal(8, expGolomb.bitsAvailable(), '8 bits remain');
  52. assert.equal(0xFF, expGolomb.readBits(8), 'the second byte is read');
  53. });
  54. QUnit.test('drops working data when skipping leading zeros', function(assert) {
  55. var expGolomb = new ExpGolomb(new Uint8Array([0x00, 0x00, 0x00, 0x00, 0xFF]));
  56. assert.equal(32, expGolomb.skipLeadingZeros(), '32 leading zeros are dropped');
  57. assert.equal(8, expGolomb.bitsAvailable(), '8 bits remain');
  58. assert.equal(0xFF, expGolomb.readBits(8), 'the second byte is read');
  59. });
  60. QUnit.test('drops working data when skipping leading zeros', function(assert) {
  61. var expGolomb = new ExpGolomb(new Uint8Array([0x15, 0xab, 0x40, 0xc8, 0xFF]));
  62. assert.equal(3, expGolomb.skipLeadingZeros(), '3 leading zeros are dropped');
  63. assert.equal((8 * 4) + 5, expGolomb.bitsAvailable(), '37 bits remain');
  64. expGolomb.skipBits(1);
  65. assert.equal(0x5a, expGolomb.readBits(8), 'the next bits are read');
  66. });
  67. QUnit.test('skipBits correctly across word-boundaries', function(assert) {
  68. var expGolomb = new ExpGolomb(new Uint8Array([0x15, 0x00, 0x00, 0x28, 0x00, 0x0a, 0x00, 0x00]));
  69. assert.equal(expGolomb.readUnsignedExpGolomb(), 9, 'the first number is read');
  70. expGolomb.skipBits(17);
  71. assert.equal(expGolomb.readUnsignedExpGolomb(), 4, 'the second number is read');
  72. expGolomb.skipBits(13); // Crosses word boundary
  73. assert.equal(expGolomb.readUnsignedExpGolomb(), 4, 'the third number is read');
  74. });
  75. QUnit.test('parses a sequence parameter set', function(assert) {
  76. var
  77. sps = new Uint8Array([
  78. 0x27, 0x42, 0xe0, 0x0b,
  79. 0xa9, 0x18, 0x60, 0x9d,
  80. 0x80, 0x35, 0x06, 0x01,
  81. 0x06, 0xb6, 0xc2, 0xb5,
  82. 0xef, 0x7c, 0x04
  83. ]),
  84. expGolomb = new ExpGolomb(sps);
  85. assert.strictEqual(expGolomb.readBits(8), 0x27, 'the NAL type specifies an SPS');
  86. assert.strictEqual(expGolomb.readBits(8), 66, 'profile_idc is 66');
  87. assert.strictEqual(expGolomb.readBits(4), 0x0E, 'constraints 0-3 are correct');
  88. expGolomb.skipBits(4);
  89. assert.strictEqual(expGolomb.readBits(8), 11, 'level_idc is 11');
  90. assert.strictEqual(expGolomb.readUnsignedExpGolomb(), 0, 'seq_parameter_set_id is 0');
  91. assert.strictEqual(expGolomb.readUnsignedExpGolomb(), 1, 'log2_max_frame_num_minus4 is 1');
  92. assert.strictEqual(expGolomb.readUnsignedExpGolomb(), 0, 'pic_order_cnt_type is 0');
  93. assert.strictEqual(expGolomb.readUnsignedExpGolomb(), 3, 'log2_max_pic_order_cnt_lsb_minus4 is 3');
  94. assert.strictEqual(expGolomb.readUnsignedExpGolomb(), 2, 'max_num_ref_frames is 2');
  95. assert.strictEqual(expGolomb.readBits(1), 0, 'gaps_in_frame_num_value_allowed_flag is false');
  96. assert.strictEqual(expGolomb.readUnsignedExpGolomb(), 11, 'pic_width_in_mbs_minus1 is 11');
  97. assert.strictEqual(expGolomb.readUnsignedExpGolomb(), 8, 'pic_height_in_map_units_minus1 is 8');
  98. assert.strictEqual(expGolomb.readBits(1), 1, 'frame_mbs_only_flag is true');
  99. assert.strictEqual(expGolomb.readBits(1), 1, 'direct_8x8_inference_flag is true');
  100. assert.strictEqual(expGolomb.readBits(1), 0, 'frame_cropping_flag is false');
  101. });