/* 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.; /* 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.; /** 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.) : 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.(); 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.(); 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; } } } }