title: How to use Android MediaCodec encode Camera data(YUV420sp)
body: <p>Thank you for your focus!
  I want to use Android MediaCodec APIs to encode the video frame which aquired from Camera,
  unfortunately, I have not success to do that! I still not familiar with the MediaCodec API。
  The follow is my codes,I need your help to figure out what I should do.</p>
  
  <p>1、The Camera setting:</p>
  
  <pre><code>Parameters parameters = mCamera.getParameters();
  parameters.setPreviewFormat(ImageFormat.NV21);
  parameters.setPreviewSize(320, 240);
  mCamera.setParameters(parameters);
  </code></pre>
  
  <p>2、Set the encoder:</p>
  
  <pre><code>private void initCodec() {
      try {
          fos = new FileOutputStream(mVideoFile, false);
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      }
      mMediaCodec = MediaCodec.createEncoderByType("video/avc");
      MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc",
              320,
              240);
      mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
      mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
      mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
              MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
      mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
      mMediaCodec.configure(mediaFormat,
              null,
              null,
              MediaCodec.CONFIGURE_FLAG_ENCODE);
      mMediaCodec.start();
      inputBuffers = mMediaCodec.getInputBuffers();
      outputBuffers = mMediaCodec.getOutputBuffers();
  }
  
  private void encode(byte[] data) {
      int inputBufferIndex = mMediaCodec.dequeueInputBuffer(0);
      if (inputBufferIndex &gt;= 0) {
          ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
          inputBuffer.clear();
          inputBuffer.put(data);
          mMediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, 0, 0);
      } else {
          return;
      }
  
      MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
      int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
      Log.i(TAG, "outputBufferIndex--&gt;" + outputBufferIndex);
      do {
          if (outputBufferIndex &gt;= 0) {
              ByteBuffer outBuffer = outputBuffers[outputBufferIndex];
              System.out.println("buffer info--&gt;" + bufferInfo.offset + "--"
                      + bufferInfo.size + "--" + bufferInfo.flags + "--"
                      + bufferInfo.presentationTimeUs);
              byte[] outData = new byte[bufferInfo.size];
              outBuffer.get(outData);
              try {
                  if (bufferInfo.offset != 0) {
                      fos.write(outData, bufferInfo.offset, outData.length
                              - bufferInfo.offset);
                  } else {
                      fos.write(outData, 0, outData.length);
                  }
                  fos.flush();
                  Log.i(TAG, "out data -- &gt; " + outData.length);
                  mMediaCodec.releaseOutputBuffer(outputBufferIndex, false);
                  outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo,
                          0);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
              outputBuffers = mMediaCodec.getOutputBuffers();
          } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
              MediaFormat format = mMediaCodec.getOutputFormat();
          }
      } while (outputBufferIndex &gt;= 0);
  }
  </code></pre>
  
  <p>I guess the problem occurred in the encoder method,the method will be used in the Camera Preview Callback ,like</p>
  
  <pre><code>initCodec();
  
  //mCamera.setPreviewCallback(new MyPreviewCallback());
  mCamera.setPreviewCallback(new PreviewCallback() {
      @Override
      public void onPreviewFrame(byte[] data, Camera camera) {
          encode(data);
      }
  });
  </code></pre>
  
  <p>I just have no idea how to do it correctly  with the MediaCodec API.Can you give me some advice or links about it?</p>
  
  <p>Thank you!</p>