a
554325746@qq.com
2020-01-15 956063ff14bc75e3a2a97c7bcaa06b9edc84ad24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.basic.security.opengles;
 
import java.nio.ByteBuffer;
import java.util.Arrays;
 
/**
 * Java version of VideoRendererInterface.  In addition to allowing clients to
 * define their own rendering behavior (by passing in a Callbacks object), this
 * class also provides a createGui() method for creating a GUI-rendering window
 * on various platforms.
 */
public class VideoRenderer {
 
 
    final long nativeVideoRenderer;
    private final Callbacks callbacks;
 
    private VideoRenderer(long nativeVideoRenderer) {
        this.nativeVideoRenderer = nativeVideoRenderer;
        callbacks = null;
    }
 
    public void dispose() {
    }
 
    /**
     * The real meat of VideoRendererInterface.
     */
    public static interface Callbacks {
        public void setSize(int width, int height);
 
        public void renderFrame(I420Frame frame);
    }
 
    /**
     * Java version of cricket::VideoFrame.
     */
    public static class I420Frame {
        public final int width;
        public final int height;
        public final int[] yuvStrides;
        public final ByteBuffer[] yuvPlanes;
 
        /**
         * Construct a frame of the given dimensions with the specified planar
         * data.  If |yuvPlanes| is null, new planes of the appropriate sizes are
         * allocated.
         */
        public I420Frame(
                int width, int height, int[] yuvStrides, ByteBuffer[] yuvPlanes) {
            this.width = width;
            this.height = height;
            this.yuvStrides = yuvStrides;
            if (yuvPlanes == null) {
                yuvPlanes = new ByteBuffer[3];
                yuvPlanes[0] = ByteBuffer.allocateDirect(yuvStrides[0] * height);
                yuvPlanes[1] = ByteBuffer.allocateDirect(yuvStrides[1] * height);
                yuvPlanes[2] = ByteBuffer.allocateDirect(yuvStrides[2] * height);
            }
            this.yuvPlanes = yuvPlanes;
        }
 
        /**
         * Copy the planes out of |source| into |this| and return |this|.  Calling
         * this with mismatched frame dimensions is a programming error and will
         * likely crash.
         */
        public I420Frame copyFrom(I420Frame source) {
            if (!Arrays.equals(yuvStrides, source.yuvStrides) ||
                    width != source.width || height != source.height) {
                throw new RuntimeException("Mismatched dimensions!  Source: " +
                        source.toString() + ", destination: " + toString());
            }
            copyPlane(source.yuvPlanes[0], yuvPlanes[0]);
            copyPlane(source.yuvPlanes[1], yuvPlanes[1]);
            copyPlane(source.yuvPlanes[2], yuvPlanes[2]);
            return this;
        }
 
        @Override
        public String toString() {
            return width + "x" + height + ":" + yuvStrides[0] + ":" + yuvStrides[1] +
                    ":" + yuvStrides[2];
        }
 
        private void copyPlane(ByteBuffer src, ByteBuffer dst) {
            src.position(0).limit(src.capacity());
            dst.put(src);
            dst.position(0).limit(dst.capacity());
        }
    }
}