a
554325746@qq.com
2019-12-25 603cb36a5123e46656b06a5deb8d7ac7ff81307f
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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 {
    // |this| either wraps a native (GUI) renderer or a client-supplied Callbacks
    // (Java) implementation; so exactly one of these will be non-0/null.
    final long nativeVideoRenderer;
    private final Callbacks callbacks;
 
    private VideoRenderer(long nativeVideoRenderer) {
        this.nativeVideoRenderer = nativeVideoRenderer;
        callbacks = null;
    }
 
    public void dispose() {
//    free(nativeVideoRenderer);
    }
//  public static VideoRenderer createGui(int x, int y) {
//    long nativeVideoRenderer = nativeCreateGuiVideoRenderer(x, y);
//    if (nativeVideoRenderer == 0) {
//      return null;
//    }
//    return new VideoRenderer(nativeVideoRenderer);
//  }
//  public VideoRenderer(Callbacks callbacks) {
//    nativeVideoRenderer = nativeWrapVideoRenderer(callbacks);
//    this.callbacks = callbacks;
//  }
 
    /**
     * 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];
        }
 
        // Copy the bytes out of |src| and into |dst|, ignoring and overwriting
        // positon & limit in both buffers.
        private void copyPlane(ByteBuffer src, ByteBuffer dst) {
//      System1.out.println("aaa src " + src.capacity() + " dst " + dst.capacity());
            src.position(0).limit(src.capacity());
            dst.put(src);
            dst.position(0).limit(dst.capacity());
        }
    }
//  private static native long nativeCreateGuiVideoRenderer(int x, int y);
//  private static native long nativeWrapVideoRenderer(Callbacks callbacks);
//
//  private static native void free(long nativeVideoRenderer);
}