Implements a workaround which allows the H.264 decoder to request key frames in addition to the depacketizer.

cusax-fix
Lyubomir Marinov 15 years ago
parent 5744ceede0
commit 4f504469bd

@ -515,6 +515,21 @@ private void padOutput(byte[] out, int outOffset)
Arrays.fill(out, outOffset, outOffset + outputPaddingSize, (byte) 0);
}
/**
* Requests a key frame from the remote peer associated with this
* <tt>DePacketizer</tt> using the logic of <tt>DePacketizer</tt>.
*
* @return <tt>true</tt> if a key frame was indeed requested in response to
* the call; otherwise, <tt>false</tt>
* @deprecated The method and its callers are part of a quick workaround to
* expose the logic of <tt>DePacketizer</tt> to <tt>JNIDecoder</tt>.
*/
public boolean requestKeyFrame()
{
setRequestKeyFrame(true);
return true;
}
/**
* Resets the states of this <tt>DePacketizer</tt> and a specific output
* <tt>Buffer</tt> so that they are ready to have this <tt>DePacketizer</tt>

@ -13,6 +13,7 @@
import net.java.sip.communicator.impl.neomedia.codec.*;
import net.java.sip.communicator.impl.neomedia.codec.video.*;
import net.java.sip.communicator.service.neomedia.control.*;
import net.sf.fmj.media.*;
/**
@ -58,6 +59,12 @@ public class JNIDecoder
*/
private int height;
/**
* The <tt>KeyFrameControl</tt> used by this <tt>JNIDecoder</tt> to
* control its key frame-related logic.
*/
private KeyFrameControl keyFrameControl;
/**
* Array of output <tt>VideoFormat</tt>s.
*/
@ -281,6 +288,12 @@ public synchronized int process(Buffer inBuffer, Buffer outBuffer)
if (!got_picture[0])
{
if ((inBuffer.getFlags() & Buffer.FLAG_RTP_MARKER) != 0)
{
if (keyFrameControl != null)
keyFrameControl.requestKeyFrame();
}
outBuffer.setDiscard(true);
return BUFFER_PROCESSED_OK;
}
@ -354,4 +367,18 @@ public Format setInputFormat(Format format)
reset();
return setFormat;
}
/**
* Sets the <tt>KeyFrameControl</tt> to be used by this
* <tt>DePacketizer</tt> as a means of control over its key frame-related
* logic.
*
* @param keyFrameControl the <tt>KeyFrameControl</tt> to be used by this
* <tt>DePacketizer</tt> as a means of control over its key frame-related
* logic
*/
public void setKeyFrameControl(KeyFrameControl keyFrameControl)
{
this.keyFrameControl = keyFrameControl;
}
}

@ -23,6 +23,7 @@
import net.java.sip.communicator.impl.neomedia.format.*;
import net.java.sip.communicator.impl.neomedia.transform.*;
import net.java.sip.communicator.service.neomedia.*;
import net.java.sip.communicator.service.neomedia.control.*;
import net.java.sip.communicator.service.neomedia.control.KeyFrameControl; // disambiguation
import net.java.sip.communicator.service.neomedia.event.*;
import net.java.sip.communicator.service.neomedia.format.*;
@ -828,13 +829,31 @@ protected void playerConfigureComplete(final Processor player)
if ("h264/rtp".equalsIgnoreCase(
getFormat().getJMFEncoding()))
{
DePacketizer depacketizer = new DePacketizer();
final DePacketizer depacketizer = new DePacketizer();
JNIDecoder decoder = new JNIDecoder();
if (keyFrameControl != null)
{
depacketizer.setKeyFrameControl(keyFrameControl);
decoder.setKeyFrameControl(
new KeyFrameControlAdapter()
{
@Override
public boolean requestKeyFrame()
{
return
depacketizer.requestKeyFrame();
}
});
}
trackControl.setCodecChain(
new Codec[] { depacketizer, playerScaler });
new Codec[]
{
depacketizer,
decoder,
playerScaler
});
}
else
{

@ -355,7 +355,6 @@ boolean processPictureFastUpdate(
Request request)
throws OperationFailedException
{
System.err.println("processPictureFastUpdate Request");
CallPeerMediaHandlerSipImpl mediaHandler = getMediaHandler();
boolean requested
= (mediaHandler == null)

@ -100,6 +100,16 @@ public void addKeyFrameRequester(
*/
public boolean removeKeyFrameRequester(KeyFrameRequester keyFrameRequester);
/**
* Requests a key frame from the remote peer of the associated
* <tt>VideoMediaStream</tt>.
*
* @return <tt>true</tt> if a key frame was indeed requested from the remote
* peer of the associated <tt>VideoMediaStream</tt> in response to the call;
* otherwise, <tt>false</tt>
*/
public boolean requestKeyFrame();
/**
* Represents a way for the remote peer of a <tt>VideoMediaStream</tt> to
* request a key frame from its local peer.

@ -248,4 +248,29 @@ public boolean removeKeyFrameRequester(KeyFrameRequester keyFrameRequester)
return false;
}
}
/**
* Implements {@link KeyFrameControl#requestKeyFrame()}.
*
* {@inheritDoc}
*/
public boolean requestKeyFrame()
{
for (KeyFrameRequester keyFrameRequester : getKeyFrameRequesters())
{
try
{
if (keyFrameRequester.requestKeyFrame())
return true;
}
catch (Exception e)
{
/*
* A KeyFrameRequestee has malfunctioned, do not let it
* interfere with the others.
*/
}
}
return false;
}
}

Loading…
Cancel
Save