no commit message
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
package org.mangui.hls.model {
|
||||
import org.mangui.hls.demux.ID3Tag;
|
||||
import org.mangui.hls.flv.FLVTag;
|
||||
import org.mangui.hls.utils.AES;
|
||||
import org.mangui.hls.utils.PTS;
|
||||
|
||||
import flash.utils.ByteArray;
|
||||
|
||||
/** Fragment Data. **/
|
||||
public class FragmentData {
|
||||
/** valid fragment **/
|
||||
public var valid : Boolean;
|
||||
/** fragment byte array **/
|
||||
public var bytes : ByteArray;
|
||||
/** bytes Loaded **/
|
||||
public var bytesLoaded : int;
|
||||
/** AES decryption instance **/
|
||||
public var decryptAES : AES;
|
||||
/** Start PTS of this chunk. **/
|
||||
public var pts_start : Number;
|
||||
/** computed Start PTS of this chunk. **/
|
||||
public var pts_start_computed : Number;
|
||||
/** min/max audio/video PTS/DTS of this chunk. **/
|
||||
public var pts_min_audio : Number;
|
||||
public var pts_max_audio : Number;
|
||||
public var pts_min_video : Number;
|
||||
public var pts_max_video : Number;
|
||||
public var dts_min : Number;
|
||||
/** audio/video found ? */
|
||||
public var audio_found : Boolean;
|
||||
public var video_found : Boolean;
|
||||
/** tag related stuff */
|
||||
public var metadata_tag_injected : Boolean;
|
||||
private var tags_pts_min_audio : Number;
|
||||
private var tags_pts_max_audio : Number;
|
||||
private var tags_pts_min_video : Number;
|
||||
private var tags_pts_max_video : Number;
|
||||
private var tags_audio_found : Boolean;
|
||||
private var tags_video_found : Boolean;
|
||||
public var tags : Vector.<FLVTag>;
|
||||
/* video dimension */
|
||||
public var video_width : int;
|
||||
public var video_height : int;
|
||||
/* is fragment loaded selected by autolevel algo */
|
||||
public var auto_level : Boolean;
|
||||
/* ID3 tags linked to this fragment */
|
||||
public var id3_tags : Vector.<ID3Tag>;
|
||||
|
||||
/** tag duration */
|
||||
private var audio_tag_duration : Number;
|
||||
private var video_tag_duration : Number;
|
||||
private var audio_tag_last_dts : Number;
|
||||
private var video_tag_last_dts : Number;
|
||||
|
||||
/** Fragment metrics **/
|
||||
public function FragmentData() {
|
||||
this.pts_start = NaN;
|
||||
this.pts_start_computed = NaN;
|
||||
this.valid = true;
|
||||
this.video_width = 0;
|
||||
this.video_height = 0;
|
||||
};
|
||||
|
||||
public function appendTags(tags : Vector.<FLVTag>) : void {
|
||||
// Audio PTS/DTS normalization + min/max computation
|
||||
for each (var tag : FLVTag in tags) {
|
||||
tag.pts = PTS.normalize(pts_start_computed, tag.pts);
|
||||
tag.dts = PTS.normalize(pts_start_computed, tag.dts);
|
||||
dts_min = Math.min(dts_min, tag.dts);
|
||||
switch( tag.type ) {
|
||||
case FLVTag.AAC_RAW:
|
||||
case FLVTag.AAC_HEADER:
|
||||
case FLVTag.MP3_RAW:
|
||||
audio_found = true;
|
||||
tags_audio_found = true;
|
||||
audio_tag_duration = tag.dts - audio_tag_last_dts;
|
||||
audio_tag_last_dts = tag.dts;
|
||||
tags_pts_min_audio = Math.min(tags_pts_min_audio, tag.pts);
|
||||
tags_pts_max_audio = Math.max(tags_pts_max_audio, tag.pts);
|
||||
pts_min_audio = Math.min(pts_min_audio, tag.pts);
|
||||
pts_max_audio = Math.max(pts_max_audio, tag.pts);
|
||||
break;
|
||||
case FLVTag.AVC_HEADER:
|
||||
case FLVTag.AVC_NALU:
|
||||
video_found = true;
|
||||
tags_video_found = true;
|
||||
video_tag_duration = tag.dts - video_tag_last_dts;
|
||||
video_tag_last_dts = tag.dts;
|
||||
tags_pts_min_video = Math.min(tags_pts_min_video, tag.pts);
|
||||
tags_pts_max_video = Math.max(tags_pts_max_video, tag.pts);
|
||||
pts_min_video = Math.min(pts_min_video, tag.pts);
|
||||
pts_max_video = Math.max(pts_max_video, tag.pts);
|
||||
break;
|
||||
case FLVTag.DISCONTINUITY:
|
||||
case FLVTag.METADATA:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
this.tags.push(tag);
|
||||
}
|
||||
}
|
||||
|
||||
public function flushTags() : void {
|
||||
// clean-up tags
|
||||
tags = new Vector.<FLVTag>();
|
||||
tags_audio_found = tags_video_found = false;
|
||||
metadata_tag_injected = false;
|
||||
pts_min_audio = pts_min_video = dts_min = tags_pts_min_audio = tags_pts_min_video = Number.POSITIVE_INFINITY;
|
||||
pts_max_audio = pts_max_video = tags_pts_max_audio = tags_pts_max_video = Number.NEGATIVE_INFINITY;
|
||||
audio_found = video_found = tags_audio_found = tags_video_found = false;
|
||||
}
|
||||
|
||||
public function shiftTags() : void {
|
||||
tags = new Vector.<FLVTag>();
|
||||
if (tags_audio_found) {
|
||||
tags_pts_min_audio = tags_pts_max_audio;
|
||||
tags_audio_found = false;
|
||||
}
|
||||
if (tags_video_found) {
|
||||
tags_pts_min_video = tags_pts_max_video;
|
||||
tags_video_found = false;
|
||||
}
|
||||
}
|
||||
|
||||
public function get pts_min() : Number {
|
||||
if (audio_found) {
|
||||
return pts_min_audio;
|
||||
} else {
|
||||
return pts_min_video;
|
||||
}
|
||||
}
|
||||
|
||||
public function get pts_max() : Number {
|
||||
if (audio_found) {
|
||||
return pts_max_audio;
|
||||
} else {
|
||||
return pts_max_video;
|
||||
}
|
||||
}
|
||||
|
||||
public function get tag_duration() : Number {
|
||||
var duration : Number;
|
||||
if (audio_found) {
|
||||
duration = audio_tag_duration;
|
||||
} else {
|
||||
duration = video_tag_duration;
|
||||
}
|
||||
if(isNaN(duration)) {
|
||||
duration = 0;
|
||||
}
|
||||
return duration;
|
||||
}
|
||||
|
||||
public function get tag_pts_min() : Number {
|
||||
if (audio_found) {
|
||||
return tags_pts_min_audio;
|
||||
} else {
|
||||
return tags_pts_min_video;
|
||||
}
|
||||
}
|
||||
|
||||
public function get tag_pts_max() : Number {
|
||||
if (audio_found) {
|
||||
return tags_pts_max_audio;
|
||||
} else {
|
||||
return tags_pts_max_video;
|
||||
}
|
||||
}
|
||||
|
||||
public function get tag_pts_start_offset() : Number {
|
||||
if (tags_audio_found) {
|
||||
return tags_pts_min_audio - pts_min_audio;
|
||||
} else {
|
||||
return tags_pts_min_video - pts_min_video;
|
||||
}
|
||||
}
|
||||
|
||||
public function get tag_pts_end_offset() : Number {
|
||||
if (tags_audio_found) {
|
||||
return tags_pts_max_audio - pts_min_audio;
|
||||
} else {
|
||||
return tags_pts_max_video - pts_min_video;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user