title: Need to play Video in ARCORE
body: <p>As we know in ARCore, we can detect 3d object while click on the horizontal plane surfaces. Instead of 3d object, <strong>I need to show Video when User is going to click the PLane Surfaces</strong>. The Look and feel should be same like 3d object is displaying. Instead of 3d object, the video should be displayed in preview mode.</p>
  
  <p>In ARcore they are currently using one Relativelayout with Surfaceview. So for displaying Video, I am using the Surfaceview and attaching with mediaplayer.</p>
  
  <pre><code>public void onsurfacecreatedvideo(){
      mProgram = createProgram(mVertexShader, mFragmentShader);
      if (mProgram == 0) {
          return;
      }
      maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
      checkGlError("glGetAttribLocation aPosition");
      if (maPositionHandle == -1) {
          throw new RuntimeException("Could not get attrib location for aPosition");
      }
      maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord");
      checkGlError("glGetAttribLocation aTextureCoord");
      if (maTextureHandle == -1) {
          throw new RuntimeException("Could not get attrib location for aTextureCoord");
      }
  
      muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
      checkGlError("glGetUniformLocation uMVPMatrix");
      if (muMVPMatrixHandle == -1) {
          throw new RuntimeException("Could not get attrib location for uMVPMatrix");
      }
  
      muSTMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uSTMatrix");
      checkGlError("glGetUniformLocation uSTMatrix");
      if (muSTMatrixHandle == -1) {
          throw new RuntimeException("Could not get attrib location for uSTMatrix");
      }
  
  
      int[] textures = new int[1];
      GLES20.glGenTextures(1, textures, 0);
  
      mTextureID = textures[0];
      GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);
      checkGlError("glBindTexture mTextureID");
  
      GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
              GLES20.GL_NEAREST);
      GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
              GLES20.GL_LINEAR);
  
          /*
           * Create the SurfaceTexture that will feed this textureID,
           * and pass it to the MediaPlayer
           */
      mSurface = new SurfaceTexture(mTextureID);
      mSurface.setOnFrameAvailableListener(this);
  
  
  
      Surface surface = new Surface(mSurface);
      mMediaPlayer.setSurface(surface);
      mMediaPlayer.setScreenOnWhilePlaying(true);
  
      surface.release();
  
      mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
          @Override
          public void onPrepared(MediaPlayer mp) {
              Log.i(TAG,"ONPREPArED abhilash");
              setVideoSize();
              mp.start();
          }
      });
      try {
          mMediaPlayer.prepare();
      } catch (IOException t) {
          Log.e(TAG, "media player prepare failed");
      }
  
      synchronized(this) {
          updateSurface = false;
      }
  
      mMediaPlayer.start();
  
  }
  
  void ondrawvideo(){
      synchronized(this) {
          if (updateSurface) {
              mSurface.updateTexImage();
              mSurface.getTransformMatrix(mSTMatrix);
              updateSurface = false;
          }
      }
  
      /////////////
      GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
  
  
      GLES20.glUseProgram(mProgram);
      checkGlError("glUseProgram");
  
      GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
      GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);
  
  
  
      mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
      GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
              TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
      checkGlError("glVertexAttribPointer maPosition");
      GLES20.glEnableVertexAttribArray(maPositionHandle);
      checkGlError("glEnableVertexAttribArray maPositionHandle");
  
      mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
      GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false,
              TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
      checkGlError("glVertexAttribPointer maTextureHandle");
      GLES20.glEnableVertexAttribArray(maTextureHandle);
      checkGlError("glEnableVertexAttribArray maTextureHandle");
  
      Matrix.setIdentityM(mMVPMatrix, 0);
      GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
      GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);
  
      GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
      checkGlError("glDrawArrays");
      GLES20.glFinish();
  
  }
  
  
          // Visualize planes.
          mPlaneRenderer.drawPlanes(mSession.getAllPlanes(), frame.getPose(), projmtx);
  
  
          // Visualize anchors created by touch.
          float scaleFactor = 1.0f;
          for (PlaneAttachment planeAttachment : mTouches) {
              ondrawvideo();
              if (!planeAttachment.isTracking()) {
                  continue;
              }
  
  
              // Get the current combined pose of an Anchor and Plane in world space. The Anchor
              // and Plane poses are updated during calls to session.update() as ARCore refines
              // its estimate of the world.
              planeAttachment.getPose().toMatrix(mAnchorMatrix, 0);
  
              // Update and draw the model and its shadow.
              mVirtualObject.updateModelMatrix(mAnchorMatrix, scaleFactor);
              mVirtualObjectShadow.updateModelMatrix(mAnchorMatrix, scaleFactor);
              mVirtualObject.draw(viewmtx, projmtx, lightIntensity);
              mVirtualObjectShadow.draw(viewmtx, projmtx, lightIntensity);
          }
  
      } catch (Throwable t) {
          // Avoid crashing the application due to unhandled exceptions.
          Log.e(TAG, "Exception on the OpenGL thread", t);
      }
  }
  </code></pre>
  
  <p>Currently my output is coming like this. When I am click on plane Surfaces, its showing like this:</p>
  
  <p><a href="https://i.stack.imgur.com/JPEFn.png" rel="nofollow noreferrer">enter image description here</a></p>
  
  <p>As you can see, below Image, I need to achieve it like this. I just marked that in this particular bugdroid image the video should be played, the video should not be exceed full screen; it should only be shown just like the bugdroid image size:</p>
  
  <p><a href="https://i.stack.imgur.com/UVhdo.jpg" rel="nofollow noreferrer">enter image description here</a></p>