Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

To intercept the decoded frames, Java class implementing IDecodedFrameInterceptor interface should be developed. The function frameDecoded() of this class will receive decoded frames in YUV format, fro for example

Code Block
languagejava
themeRDark
titleTestInterceptor.java
// Package name should be strictly defined as com.flashphoner.frameInterceptor
package com.flashphoner.frameInterceptor;
 
// Import decoded frame interceptor interface
import com.flashphoner.sdk.media.IDecodedFrameInterceptor;
// Import YUV frame description
import com.flashphoner.sdk.media.YUVFrame;
 
 
/**
 * Custom decoded frames interceptor implementation example
 * The example daws a cross over the picture
 */
public class TestInterceptor implements IDecodedFrameInterceptor {
 
    // Constants to parse pixel
    private final int Y = 0;
    private final int U = 1;
    private final int V = 2;
    
    // Dark colored pixel
    private final byte[] DarkPixel = new byte []{42, -128, -128};
    
    /**
     * Function to handle decoded frame
     * @param streamName - stream name
     * @param frame - decoded YUV frame
     */
    @Override
    public void frameDecoded(String streamName, YUVFrame frame) {
        // Get frame height
        int frameHeight = frame.getHeight();
        // Get frame width
        int frameWidth = frame.getWidth();
        // Declare cross lines padding
        int PADDING = 4;
        // Define frame center
        int frameCenterX = frameWidth / 2;
        int frameCenterY = frameHeight / 2;
        // Define vertical line bounds
        int leftBound = frameCenterX - PADDING;
        int rightBound = frameCenterX + PADDING;
        // Define horizontal line bounds
        int topBound = frameCenterY - PADDING;
        int bottomBound = frameCenterY + PADDING;
        
        // Walk through the frame pixels and draw a cross
        for (int x = 0; x < frameWidth; x++) {
             for (int y = 0; y < frameHeight; y++) {
                  if (validateCoord(x, leftBound, rightBound) || validateCoord(y, topBound, bottomBound)) {
                      // Read the pixel
                      byte[] pixel = frame.readPixel(x, y);
                      // Modify the pixel
                      pixel[Y] = DarkPixel[Y];
                      pixel[U] = DarkPixel[U];
                      pixel[V] = DarkPixel[V];
                      // Write the pixel back
                      frame.writePixel(x, y, pixel);
                  }
             }
        }
    }
    
    /**
     * Helper function to validate pixel drawing
     * @param coord - pixel coordinate
     * @param low - low coordinate bound 
     * @param high - high coordinate bound 
     * @return true if coordinate is valid
     */
     private boolean validateCoord(int coord, int low, int high) {
        return (coord > low && coord < high);
     }
}

...