/*
* @(#)DePacketizer.java 1.3 02/08/21 SMI
*
* Copyright 1999 by Sun Microsystems, Inc.,
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Sun Microsystems, Inc. ("Confidential Information"). You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Sun.
*/
package com.sun.media.codec.video.mpeg;
import javax.media.*;
import javax.media.Format;
import javax.media.format.VideoFormat;
import com.sun.media.*;
public class DePacketizer extends BasicCodec {
private VideoFormat inputFormat = null;
private VideoFormat outputFormat = null;
// RTP depacketizer if inputFormat is MPEG_RTP
private RTPDePacketizer rtpdp = null;
// Initialize default formats.
public DePacketizer() {
inputFormats = new Format[] { new VideoFormat(VideoFormat.MPEG_RTP) };
outputFormats = new Format[] { new VideoFormat(VideoFormat.MPEG) };
}
protected Format getInputFormat() {
return inputFormat;
}
protected Format getOutputFormat() {
return outputFormat;
}
// Return supported output formats
public Format [] getSupportedOutputFormats(Format in) {
if (in == null)
return outputFormats;
// Make sure the input is MPEG video format
if (matches(in, inputFormats) == null)
return new Format[0];
Format out [] = new Format[1];
out[0] = makeMPEGFormat(in);
return out;
}
public Format setInputFormat(Format input) {
inputFormat = (VideoFormat) input;
return input;
}
public Format setOutputFormat(Format output) {
if (!(output instanceof VideoFormat)) return null;
outputFormat = makeMPEGFormat(output);
return output;
}
private final VideoFormat makeMPEGFormat(Format in) {
VideoFormat vf = (VideoFormat)in;
return new VideoFormat(VideoFormat.MPEG,
vf.getSize(),
VideoFormat.NOT_SPECIFIED,
Format.byteArray,
vf.getFrameRate());
}
public void open() throws ResourceUnavailableException {
if (inputFormat == null || outputFormat == null)
throw new ResourceUnavailableException(
"Incorrect formats set on MPEG video depacketizer");
rtpdp = new RTPDePacketizer();
}
public synchronized void close() {
rtpdp = null;
}
public void reset() {
// Anything to do?
}
public synchronized int process(Buffer inBuffer, Buffer outBuffer) {
if (isEOM(inBuffer)) {
propagateEOM(outBuffer);
return BUFFER_PROCESSED_OK;
}
if (inBuffer.isDiscard()) {
updateOutput(outBuffer, outputFormat, 0, 0);
outBuffer.setDiscard(true);
return OUTPUT_BUFFER_NOT_FILLED;
}
// if the encoding is MPEG_RTP, send this packet over to the
// depacketizer, which will do all the work for you. If the
// depacketizer has not finished constructing a frame, dont
// send it for decoding and just return. If the depacketizer
// has finished constructing an entire frame, send it to the
// decoder.
int retVal = rtpdp.process(inBuffer, outBuffer);
// return any value from the depacketizer except,
// BUFFER_PROCESSED_OK, which indicates a complete frame
// is ready for decoding
if (retVal != BUFFER_PROCESSED_OK) {
return retVal;
}
// at this time, the outBuffer contains a complete MPEG
// frame of format MPEG
// get the outputFormat from the buffer only if this is the first time.
if (outputFormat == null) {
outputFormat = (VideoFormat) outBuffer.getFormat();
}
return BUFFER_PROCESSED_OK;
}
public void finalize() {
close();
}
public String getName() {
return "MPEG Video DePacketizer";
}
}
|