package org.red5.server.stream; /* * RED5 Open Source Flash Server - http://www.osflash.org/red5 * * Copyright (c) 2006-2009 by respective authors (see below). All rights reserved. * * This library is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation; either version 2.1 of the License, or (at your option) any later * version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along * with this library; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ import java.util.LinkedList; import java.util.Queue; import org.red5.server.net.rtmp.event.IRTMPEvent; import org.red5.server.stream.message.RTMPMessage; /** * A Play buffer for sending VOD. * The implementation is not synchronized. * * @author The Red5 Project (red5@osflash.org) * @author Steven Gong (steven.gong@gmail.com) */ public class PlayBuffer { /** * Buffer capacity */ private long capacity; /** * Message size */ private long messageSize; /** * Queue of RTMP messages */ private Queue<RTMPMessage> messageQueue = new LinkedList<RTMPMessage>(); /** * Create play buffer with given capacity * @param capacity Capacity of buffer */ public PlayBuffer(long capacity) { this.capacity = capacity; } /** * Buffer capacity in bytes. * * @return Buffer capacity in bytes */ public long getCapacity() { return capacity; } /** * Setter for capacity * * @param capacity New capacity */ public void setCapacity(long capacity) { this.capacity = capacity; } /** * Number of messages in buffer. * * @return Number of messages in buffer */ public int getMessageCount() { return messageQueue.size(); } /** * Total message size in bytes. * * @return Total message size in bytes */ public long getMessageSize() { return messageSize; } /** * Put a message into this buffer. * * @param message RTMP message * @return <tt>true</tt> indicates success and <tt>false</tt> * indicates buffer is full. */ public boolean putMessage(RTMPMessage message) { IRTMPEvent body = message.getBody(); if (!(body instanceof IStreamData)) { throw new RuntimeException("expected IStreamData but got " + body); } int size = ((IStreamData) body).getData().limit(); if (messageSize + size > capacity) { return false; } messageSize += size; messageQueue.offer(message); return true; } /** * Take a message from this buffer. The message count decreases. * * @return <tt>null</tt> if buffer is empty. */ public RTMPMessage takeMessage() { RTMPMessage message = messageQueue.poll(); if (message != null) { IRTMPEvent body = message.getBody(); if (!(body instanceof IStreamData)) { throw new RuntimeException("expected IStreamData but got " + body); } messageSize -= ((IStreamData) body).getData().limit(); } return message; } /** * Peek a message but not take it from the buffer. The message count * doesn't change. * @return <tt>null</tt> if buffer is empty. */ public RTMPMessage peekMessage() { return messageQueue.peek(); } /** * Empty this buffer. */ public void clear() { messageQueue.clear(); messageSize = 0; } }