📄 jmfextending.html
字号:
</code><a name="105098"> </a>
<a name="105099"> </a><code> return new Format[] {oaf};
</code><a name="105100"> </a><code> }
</code><a name="105101"> </a>
<a name="105102"> </a><code> /** gain accessor method **/
</code><a name="105103"> </a><code> public void setGain(float newGain){
</code><a name="105104"> </a><code> gain=newGain;
</code><a name="105105"> </a><code> }
</code><a name="105111"> </a><code> /** return effect name **/
</code><a name="105112"> </a><code> public String getName() {
</code><a name="105113"> </a><code> return EffectName;
</code><a name="105114"> </a><code> }
</code><a name="105115"> </a>
<a name="105116"> </a><code> /** do the processing **/
</code><a name="105117"> </a><code> public int process(Buffer inputBuffer, Buffer outputBuffer){
</code><a name="105118"> </a>
<a name="105119"> </a><code> // == prolog
</code><a name="105120"> </a><code> byte[] inData = (byte[])inputBuffer.getData();
</code><a name="105121"> </a><code> int inLength = inputBuffer.getLength();
</code><a name="105122"> </a><code> int inOffset = inputBuffer.getOffset();
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="105133"> </a><code> byte[] outData = validateByteArraySize(outputBuffer, inLength);
</code><a name="105134"> </a><code> int outOffset = outputBuffer.getOffset();
</code><a name="105135"> </a>
<a name="105136"> </a><code> int samplesNumber = inLength / 2 ;
</code><a name="105147"> </a>
<a name="105148"> </a><code> // == main
</code><a name="105149"> </a>
<a name="105150"> </a><code> for (int i=0; i< samplesNumber;i++) {
</code><a name="105151"> </a><code> int tempL = inData[inOffset ++];
</code><a name="105152"> </a><code> int tempH = inData[inOffset ++];
</code><a name="105153"> </a><code> int sample = tempH | (tempL & 255);
</code><a name="105154"> </a>
<a name="105155"> </a><code> sample = (int)(sample * gain);
</code><a name="105156"> </a>
<a name="105157"> </a><code> if (sample>32767) // saturate
</code><a name="105158"> </a><code> sample = 32767;
</code><a name="105159"> </a><code> else if (sample < -32768)
</code><a name="105160"> </a><code> sample = -32768;
</code><a name="105161"> </a>
<a name="105162"> </a><code> outData[outOffset ++]=(byte) (sample & 255);
</code><a name="105163"> </a><code> outData[outOffset ++]=(byte) (sample >> 8);
</code><a name="105164"> </a>
<a name="105165"> </a><code> }
</code><a name="105166"> </a>
<a name="105167"> </a><code> // == epilog
</code><a name="105168"> </a><code> updateOutput(outputBuffer,outputFormat, samplesNumber, 0);
</code><a name="105169"> </a><code> return BUFFER_PROCESSED_OK;
</code><a name="105175"> </a><code> }
</code><a name="105176"> </a><code> /**
</code><a name="105177"> </a><code> * Utility: validate that the Buffer object's data size is at least
</code><a name="105178"> </a><code> * newSize bytes.
</code><a name="105179"> </a><code> * @return array with sufficient capacity
</code><a name="105180"> </a><code> **/
</code><a name="105181"> </a><code> protected byte[] validateByteArraySize(Buffer buffer,int newSize) {
</code><a name="105182"> </a><code> Object objectArray=buffer.getData();
</code><a name="105183"> </a><code> byte[] typedArray;
</code><a name="105184"> </a><code> if (objectArray instanceof byte[]) { // is correct type AND not null
</code><a name="105185"> </a><code> typedArray=(byte[])objectArray;
</code><a name="105186"> </a><code> if (typedArray.length >= newSize ) { // is sufficient capacity
</code><a name="105187"> </a><code> return typedArray;
</code><a name="105188"> </a><code> }
</code><a name="105189"> </a><code> }
</code><a name="105195"> </a><code> System.out.println(getClass().getName()+
</code><a name="105196"> </a><code> " : allocating byte["+newSize+"] ");
</code><a name="105197"> </a><code> typedArray = new byte[newSize];
</code><a name="105198"> </a><code> buffer.setData(typedArray);
</code><a name="105199"> </a><code> return typedArray;
</code><a name="105200"> </a><code> }
</code><a name="105206"> </a><code> /** utility: update the output buffer fields **/
</code><a name="105207"> </a><code> protected void updateOutput(Buffer outputBuffer,
</code><a name="105208"> </a><code> Format format,int length, int offset) {
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="105218"> </a><code> outputBuffer.setFormat(format);
</code><a name="105219"> </a><code> outputBuffer.setLength(length);
</code><a name="105220"> </a><code> outputBuffer.setOffset(offset);
</code><a name="105221"> </a><code> }
</code><a name="105222"> </a><code>}
</code></pre>
</font></td>
</tr>
</table>
<br></font>
<h4>
<a name="94866"> </a><font color="#003366" face="Palatino, Times New Roman, Times, serif">Implementing a Multiplexer Plug-In</font>
</h4>
<p>
<a name="94867"> </a><font face="Palatino, Times New Roman, Times, serif">A <code>Multiplexer</code> is essentially the opposite of a <code>Demultiplexer</code>: it takes individual tracks of media data and merges them into a single multiplexed media-stream such as an MPEG or QuickTime file. You might want to implement a <code>Multiplexer</code> plug-in to support a custom <code>DataSource</code> or provide a higher-performance. However, it's not always necessary to implement a separate <code>Multiplexer</code> plug-in--multiplexing can also be performed by a <code>DataSink</code>.</font>
</p>
<p>
<a name="94868"> </a><font face="Palatino, Times New Roman, Times, serif">A <code>Multiplexer</code> is a multi-input, single-output processing component. It reads data from a set of tracks and outputs a <code>DataSource</code>.</font>
</p>
<p>
<a name="94869"> </a><font face="Palatino, Times New Roman, Times, serif">The main work performed by a <code>Multiplexer</code> is done in the implementation of the <code>process</code> method. The <code>getDataSource</code> method returns the <code>DataSource</code> generated by the <code>Multiplexer</code>.</font>
</p>
<p>
<a name="94870"> </a><font face="Palatino, Times New Roman, Times, serif">When you implement a <code>Multiplexer</code>, you need to:</font>
</p>
<ol type="1">
<li value="1"><a name="94871"> </a><font face="Palatino, Times New Roman, Times, serif">Implement <code>getSupportedOutputContentDescriptors</code> to advertise what output formats the <code>Multiplexer</code> supports.</font>
<li value="2"><a name="94872"> </a><font face="Palatino, Times New Roman, Times, serif">Enable the selection of the output format by implementing <code>setOutputContentDescriptor</code>.</font>
<li value="3"><a name="94873"> </a><font face="Palatino, Times New Roman, Times, serif">Implement <code>process</code> to actually merge the individual tracks into an output stream of the selected format.</font>
</ol>
<p>
<a name="94874"> </a><font face="Palatino, Times New Roman, Times, serif">Unlike a <code>Codec</code>, there is no specific query mechanism. The <code>initializeTracks</code> method should return <code>false</code> if any of the specified track formats are not supported.</font>
</p>
<h4>
<a name="94875"> </a><font color="#003366" face="Palatino, Times New Roman, Times, serif">Implementing a Renderer Plug-In</font>
</h4>
<p>
<a name="94876"> </a><font face="Palatino, Times New Roman, Times, serif">A <code>Renderer</code> delivers media data in its final processed state. It is a single-input processing component with no output. <code>Renderer</code> plug-ins read data from a <code>DataSource</code> and typically present the media data to the user, but can also be used to provide access to the processed media data for use by another application or device. For example, you might implement a <code>Renderer</code> plug-in if you want to render a video to a location other than the screen.</font>
</p>
<p>
<a name="94877"> </a><font face="Palatino, Times New Roman, Times, serif">If you're implementing a video renderer, you should implement the <code>VideoRenderer</code> interface, which extends <code>Renderer</code> to define video-specific attributes such as the <code>Component</code> where the video will be rendered. </font>
</p>
<p>
<a name="103928"> </a><font face="Palatino, Times New Roman, Times, serif">The main work performed by a <code>Renderer</code> is done in the implementation of the <code>process</code> method. When you implement a <code>Renderer</code>, you need to:</font>
</p>
<ol type="1">
<li value="1"><a name="95335"> </a><font face="Palatino, Times New Roman, Times, serif">Implement <code>getSupportedInputFormats</code> to advertise what input formats the <code>Renderer</code> supports.</font>
<li value="2"><a name="95336"> </a><font face="Palatino, Times New Roman, Times, serif">Enable the selection of the input format by implementing <code>setInputFormat</code>.</font>
<li value="3"><a name="95357"> </a><font face="Palatino, Times New Roman, Times, serif">Implement <code>process</code> to actually process the data and render it to the output device that this <code>Renderer</code> represents.</font>
</ol>
<h5>
<a name="97802"> </a><i><font color="#003366" face="Palatino, Times New Roman, Times, serif">Example: AWTRenderer</font></i>
</h5>
<p>
<a name="98210"> </a><font face="Palatino, Times New Roman, Times, serif">This example implements the <code>Renderer</code> plug-in to create a <code>Renderer</code> for RGB images that uses <code>AWT</code> <code>Image</code>.</font>
</p>
<a name="105792"> </a><font size="1" face="Palatino, Times New Roman, Times, serif">
<table border="1" bordercolorlight="#FFFFFF" bordercolordark="#000000"
cellpadding="5" cellspacing="0">
<caption><b><i><font face="Palatino, Times New Roman, Times, serif"><a name="105345"> </a>Example 6-5: Implementing a Renderer plug-in (1 of 7)</font></i></b></caption>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="105357"> </a><code>import javax.media.*;
</code><a name="105358"> </a><code>import javax.media.renderer.VideoRenderer;
</code><a name="105359"> </a><code>import javax.media.format.Format;
</code><a name="105360"> </a><code>import javax.media.format.video.VideoFormat;
</code><a name="105361"> </a><code>import javax.media.format.video.RGBFormat;
</code><a name="105362"> </a><code>import java.awt.*;
</code><a name="105363"> </a><code>import java.awt.image.*;
</code><a name="105364"> </a><code>import java.awt.event.*;
</code><a name="105365"> </a><code>import java.util.Vector;
</code></pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="105394"> </a><code>/*******************************************************************
</code><a name="105395"> </a><code> * Renderer for RGB images using AWT Image.
********************************************************************/
</code><a name="105396"> </a><code>public class SampleAWTRenderer implements
javax.media.renderer.VideoRenderer {
</code><a name="105402"> </a><code> /**
* Variables and Constants
**/
</code><a name="105403"> </a>
<a name="105404"> </a><code> // The descriptive name of this renderer
</code><a name="105405"> </a><code> private static final String name = "Sample AWT Renderer";
</code><a name="105406"> </a>
<a name="105407"> </a><code> protected RGBFormat inputFormat;
</code><a name="105408"> </a><code> protected RGBFormat supportedRGB;
</code><a name="105409"> </a><code> protected Format [] supportedFormats;
</code><a name="105410"> </a>
<a name="105411"> </a><code> protected MemoryImageSource sourceImage;
</code><a name="105412"> </a><code> protected Image destImage;
</code><a name="105413"> </a><code> protected Buffer lastBuffer = null;
</code><a name="105414"> </a>
<a name="105415"> </a><code> protected int inWidth = 0;
</code><a name="105416"> </a><code> protected int inHeight = 0;
</code><a name="105417"> </a><code> protected Component component = null;
</code><a name="105418"> </a><code> protected Rectangle reqBounds = null;
</code><a name="105419"> </a><code> protected Rectangle bounds = new Rectangle();
</code><a name="105420"> </a><code> protected boolean started = false;
</code><a name="105421"> </a><code>
</code><a name="105422"> </a><code> /**
* Constructor
**/
</code><a name="105423"> </a><code>
</code><a name="105424"> </a><code> public SampleAWTRenderer() {
</code><a name="105425"> </a><code> // Prepare supported input formats and preferred format
</code><a name="105426"> </a><code> int rMask = 0x000000FF;
</code><a name="105427"> </a><code> int gMask = 0x0000FF00;
</code><a name="105428"> </a><code> int bMask = 0x00FF0000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -