|
1 | 1 | import chai from 'chai';
|
2 | 2 | import sinonChai from 'sinon-chai';
|
| 3 | +import { LoadStats } from '../../../src/loader/load-stats'; |
3 | 4 | import M3U8Parser from '../../../src/loader/m3u8-parser';
|
4 | 5 | import { PlaylistLevelType } from '../../../src/types/loader';
|
5 | 6 | import { AttrList } from '../../../src/utils/attr-list';
|
@@ -1688,20 +1689,76 @@ fileSequence2.ts
|
1688 | 1689 | null,
|
1689 | 1690 | );
|
1690 | 1691 | const fragments = details.fragments as Fragment[];
|
| 1692 | + expect(fragments[0].bitrate).to.equal(5083000); |
1691 | 1693 | expectWithJSONMessage(fragments[0].tagList).to.deep.equal([
|
1692 | 1694 | ['INF', '5.97263', '\t'],
|
1693 | 1695 | ['BITRATE', '5083'],
|
1694 | 1696 | ]);
|
| 1697 | + |
| 1698 | + expect(fragments[1].bitrate).to.equal(5453000); |
1695 | 1699 | expectWithJSONMessage(fragments[1].tagList).to.deep.equal([
|
1696 | 1700 | ['INF', '5.97263', '\t'],
|
1697 | 1701 | ['BITRATE', '5453'],
|
1698 | 1702 | ]);
|
| 1703 | + |
| 1704 | + expect(fragments[2].bitrate).to.equal(4802000); |
1699 | 1705 | expectWithJSONMessage(fragments[2].tagList).to.deep.equal([
|
1700 | 1706 | ['INF', '5.97263', '\t'],
|
1701 | 1707 | ['BITRATE', '4802'],
|
1702 | 1708 | ]);
|
1703 | 1709 | });
|
1704 | 1710 |
|
| 1711 | + it('parses segment tags used to get bitrate and byte length from fragments', function () { |
| 1712 | + const playlist = `#EXTM3U |
| 1713 | +#EXT-X-TARGETDURATION:6 |
| 1714 | +#EXT-X-VERSION:3 |
| 1715 | +#EXT-X-MEDIA-SEQUENCE:0 |
| 1716 | +#EXT-X-PLAYLIST-TYPE:VOD |
| 1717 | +#EXTINF:5 |
| 1718 | +#EXT-X-BITRATE:1000 |
| 1719 | +fileSequence0.ts |
| 1720 | +#EXTINF:5 |
| 1721 | +#EXT-X-BYTERANGE:600000@123456 |
| 1722 | +fileSequence1.ts |
| 1723 | +#EXTINF: 5 |
| 1724 | +fileSequence2.ts |
| 1725 | +`; |
| 1726 | + const details = M3U8Parser.parseLevelPlaylist( |
| 1727 | + playlist, |
| 1728 | + 'http://dummy.url.com/playlist.m3u8', |
| 1729 | + 0, |
| 1730 | + PlaylistLevelType.MAIN, |
| 1731 | + 0, |
| 1732 | + null, |
| 1733 | + ); |
| 1734 | + const fragments = details.fragments as Fragment[]; |
| 1735 | + expect(fragments[0].byteLength).to.equal(null); |
| 1736 | + expect(fragments[0].bitrate).to.equal(1000000); |
| 1737 | + expect(fragments[1].byteLength).to.equal(600000); |
| 1738 | + expect(fragments[1].bitrate).to.equal(960000); |
| 1739 | + expect(fragments[2].byteLength).to.equal(null); |
| 1740 | + expect(fragments[2].bitrate).to.equal( |
| 1741 | + 1000000, |
| 1742 | + '#EXT-X-BITRATE applies to every segment between it and the next bitrate tag', |
| 1743 | + ); |
| 1744 | + |
| 1745 | + // Stat data overrides byteLength and bitrate data |
| 1746 | + fragments[2].stats = new LoadStats(); |
| 1747 | + fragments[2].stats.total = 12000; |
| 1748 | + expect(fragments[2].byteLength).to.equal(12000); |
| 1749 | + expect(fragments[2].bitrate).to.equal(19200); |
| 1750 | + |
| 1751 | + fragments[1].stats = new LoadStats(); |
| 1752 | + fragments[1].stats.total = 8000000; |
| 1753 | + expect(fragments[1].byteLength).to.equal(8000000); |
| 1754 | + expect(fragments[1].bitrate).to.equal(12800000); |
| 1755 | + |
| 1756 | + fragments[0].stats = new LoadStats(); |
| 1757 | + fragments[0].stats.total = 5000000; |
| 1758 | + expect(fragments[0].byteLength).to.equal(5000000); |
| 1759 | + expect(fragments[0].bitrate).to.equal(8000000); |
| 1760 | + }); |
| 1761 | + |
1705 | 1762 | it('adds GAP to fragment.tagList and sets fragment.gap', function () {
|
1706 | 1763 | const playlist = `#EXTM3U
|
1707 | 1764 | #EXT-X-TARGETDURATION:5
|
|
0 commit comments