Blame view

node_modules/mux.js/lib/m2ts/timestamp-rollover-stream.js 2.1 KB
2a09d1a4   liuqimichale   添加宜春 天水 宣化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  /**
   * mux.js
   *
   * Copyright (c) 2016 Brightcove
   * All rights reserved.
   *
   * Accepts program elementary stream (PES) data events and corrects
   * decode and presentation time stamps to account for a rollover
   * of the 33 bit value.
   */
  
  'use strict';
  
  var Stream = require('../utils/stream');
  
  var MAX_TS = 8589934592;
  
  var RO_THRESH = 4294967296;
  
  var handleRollover = function(value, reference) {
    var direction = 1;
  
    if (value > reference) {
      // If the current timestamp value is greater than our reference timestamp and we detect a
      // timestamp rollover, this means the roll over is happening in the opposite direction.
      // Example scenario: Enter a long stream/video just after a rollover occurred. The reference
      // point will be set to a small number, e.g. 1. The user then seeks backwards over the
      // rollover point. In loading this segment, the timestamp values will be very large,
      // e.g. 2^33 - 1. Since this comes before the data we loaded previously, we want to adjust
      // the time stamp to be `value - 2^33`.
      direction = -1;
    }
  
    // Note: A seek forwards or back that is greater than the RO_THRESH (2^32, ~13 hours) will
    // cause an incorrect adjustment.
    while (Math.abs(reference - value) > RO_THRESH) {
      value += (direction * MAX_TS);
    }
  
    return value;
  };
  
  var TimestampRolloverStream = function(type) {
    var lastDTS, referenceDTS;
  
    TimestampRolloverStream.prototype.init.call(this);
  
    this.type_ = type;
  
    this.push = function(data) {
      if (data.type !== this.type_) {
        return;
      }
  
      if (referenceDTS === undefined) {
        referenceDTS = data.dts;
      }
  
      data.dts = handleRollover(data.dts, referenceDTS);
      data.pts = handleRollover(data.pts, referenceDTS);
  
      lastDTS = data.dts;
  
      this.trigger('data', data);
    };
  
    this.flush = function() {
      referenceDTS = lastDTS;
      this.trigger('done');
    };
  
    this.discontinuity = function() {
      referenceDTS = void 0;
      lastDTS = void 0;
    };
  
  };
  
  TimestampRolloverStream.prototype = new Stream();
  
  module.exports = {
    TimestampRolloverStream: TimestampRolloverStream,
    handleRollover: handleRollover
  };