public void visit()

in src/main/java/com/amazonaws/kinesisvideo/parser/utilities/FrameRendererVisitor.java [85:130]


        public void visit(final MkvDataElement dataElement) throws MkvElementVisitException {
            log.info("Got data element: {}", dataElement.getElementMetaData().getTypeInfo().getName());
            final String dataElementName = dataElement.getElementMetaData().getTypeInfo().getName();

            if ("SimpleBlock".equals(dataElementName)) {
                final MkvValue<Frame> frame = dataElement.getValueCopy();
                final ByteBuffer frameBuffer = frame.getVal().getFrameData();
                final MkvTrackMetadata trackMetadata = fragmentMetadataVisitor.getMkvTrackMetadata(
                        frame.getVal().getTrackNumber());
                final int pixelWidth = trackMetadata.getPixelWidth().get().intValue();
                final int pixelHeight = trackMetadata.getPixelHeight().get().intValue();
                codecPrivateData = trackMetadata.getCodecPrivateData().array();
                log.debug("Decoding frames ... ");
                // Read the bytes that appear to comprise the header
                // See: https://www.matroska.org/technical/specs/index.html#simpleblock_structure

                final Picture rgb = Picture.create(pixelWidth, pixelHeight, ColorSpace.RGB);
                final BufferedImage renderImage = new BufferedImage(
                        pixelWidth, pixelHeight, BufferedImage.TYPE_3BYTE_BGR);
                final AvcCBox avcC = AvcCBox.parseAvcCBox(ByteBuffer.wrap(codecPrivateData));

                decoder.addSps(avcC.getSpsList());
                decoder.addPps(avcC.getPpsList());

                final Picture buf = Picture.create(pixelWidth + ((16 - (pixelWidth % 16)) % 16),
                        pixelHeight + ((16 - (pixelHeight % 16)) % 16), ColorSpace.YUV420J);
                final List<ByteBuffer> byteBuffers = splitMOVPacket(frameBuffer, avcC);
                final Picture pic = decoder.decodeFrameFromNals(byteBuffers, buf.getData());

                if (pic != null) {
                    // Work around for color issues in JCodec
                    // https://github.com/jcodec/jcodec/issues/59
                    // https://github.com/jcodec/jcodec/issues/192
                    final byte[][] dataTemp = new byte[3][pic.getData().length];
                    dataTemp[0] = pic.getPlaneData(0);
                    dataTemp[1] = pic.getPlaneData(2);
                    dataTemp[2] = pic.getPlaneData(1);

                    final Picture tmpBuf = Picture.createPicture(pixelWidth, pixelHeight, dataTemp, ColorSpace.YUV420J);
                    transform.transform(tmpBuf, rgb);
                    AWTUtil.toBufferedImage(rgb, renderImage);
                    kinesisVideoFrameViewer.update(renderImage);
                    frameCount++;
                }
            }
        }