/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.packet.mpegts.nw; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import com.ttProject.media.mpegts.field.AdaptationField; import com.ttProject.media.mpegts.packet.Pes; /** * 映像データ保持オブジェクト * このクラスに、Pesデータを投げ込んでいきます。 * 取得すると、KeyFrameから次のkeyFrameまでのデータが応答されます。 * @author taktod */ public class VideoData extends MediaData { /** ロガー */ @SuppressWarnings("unused") private final Logger logger = Logger.getLogger(VideoData.class); /** 映像のpesデータリスト */ private final List<Pes> videoPesList = new ArrayList<Pes>(); /** 映像のキーフレームのpesデータリスト(キーフレームの先頭の部分となります。) */ private final List<Pes> keyPesList = new ArrayList<Pes>(); /** * pesデータを解析します。 */ @Override public void analyzePes(Pes pes) { if(!checkPes(pes)) { return; } // pesデータはそのまま保持しておけばいいと思われる。 // 順番にいれていくだけ、 // ただしkeyFrameの位置だけは知っておく必要あり。 videoPesList.add(pes); // データの開始位置であるか参照 if(pes.isPayloadUnitStart()) { // データの開始位置の場合は、keyFrameかinnerFrameの始まりの部分 AdaptationField field = pes.getAdaptationField(); if(field != null) { // ランダムアクセスしていい場所である場合(要はアクセス開始位置(keyFrameとなる)) if(field.getRandomAccessIndicator() == 1) { // キーフレームの位置となる。 keyPesList.add(pes); } } } } /** * 現在保持しているデータの終端pts値 * @return -1:存在しない。 数値:対象pts */ @Override public long getLastDataPts() { Pes lastKeyFramePes = keyPesList.get(keyPesList.size() - 1); if(lastKeyFramePes == null) { return -1; } return lastKeyFramePes.getPts().getPts(); } /** * 現在保持しているデータの先頭pts値 * @return -1:存在しない。 数値:対象pts */ @Override public long getFirstDataPts() { Pes firstKeyFramePes = keyPesList.get(0); if(firstKeyFramePes == null) { return -1; } return firstKeyFramePes.getPts().getPts(); } /** * 先頭を取り出す * @return */ public Pes shift() { return videoPesList.remove(0); } /** * 先頭に追加 * @param pes */ public void unshift(Pes pes) { videoPesList.add(0, pes); } }