...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
// Package name should be strictly defined as com.flashphoner.mixerlayout package com.flashphoner.mixerlayout; // Import mixer layout interface import com.flashphoner.sdk.media.IVideoMixerLayout; // Import YUV frame description import com.flashphoner.sdk.media.YUVFrame; // Import Java packages to use import java.awt.*; import java.util.ArrayList; public class TestLayout /** * Custom mixer layout implementation example */ public class TestLayout implements IVideoMixerLayout { // Pictures padding, should be even (or zero if no padding needed) private static final int PADDING = 4; @Override/** public Layout[] computeLayout(YUVFrame[] yuvFrames, String[] strings, int canvasWidth, int canvasHeight) {* Function to compute layout, will be called by mixer before encoding output stream picture * This example computes grid layout * @param yuvFrames - incoming streams raw pictures array in YUV format * @param strings - incoming streams names array * @param canvasWidth - mixer output picture canwas width * @param canvasHeight - mixer output picture canwas heigth * @return array of pictures layouts */ @Override public Layout[] computeLayout(YUVFrame[] yuvFrames, String[] strings, int canvasWidth, int canvasHeight) { // Declare picture layouts list to fill ArrayList<IVideoMixerLayout.Layout> layout = new ArrayList<>(); // Find canvas center height int canvasCenter = canvasHeight / 2; // Find frame center int frameCenter = canvasCenter - (canvasHeight / yuvFrames.length) / 2; // Find every picture dimensions (this are the same for all the pictures because this is grid layout) ArrayList<IVideoMixerLayout.Layout>int layoutlayoutWidth = new ArrayList<>(); canvasWidth / yuvFrames.length - PADDING; int canvasCenterlayoutHeight = canvasHeight / 2yuvFrames.length; // Iterate through incoming stream pictures intarray frameCenter = canvasCenter - (canvasHeight / yuvFrames.length) // 2; int layoutWidth = canvasWidth / yuvFrames.length - PADDING; Note: streams pictures order corresponds to stream names array, use this to reorder pictures if needed for (int layoutHeightc = canvasHeight /0; c < yuvFrames.length; c++) { for (int c =// 0;Use cJava < yuvFrames.length; c++) {AWT Point and Dimension Point prevPoint = new Point(); Dimension prevDimension = new Dimension(); if (layout.size() > 0) { // Find previous picture location to calculate next one prevPoint.setLocation(layout.get(c - 1).getPoint()); prevDimension.setSize(layout.get(c - 1).getDimension()); } // Set starting point of the }picture Point currentPoint = new Point((int) (prevPoint.getX() + prevDimension.getWidth() + PADDING), frameCenter); // Create the picture layout passing starting point, dimensions and raw picture YUV frames layout.add(new IVideoMixerLayout.Layout(currentPoint, new Dimension(layoutWidth, layoutHeight), yuvFrames[c])); } // Return pictures layouts calculated as array return layout.toArray(new IVideoMixerLayout.Layout[layout.size()]); } } |
...