title: How to use MediaCodec without MediaExtractor for H264
body: <p>I need to use MediaCodec without the MediaExtractor and I'm reading the file using a FileInputStream. Currently it is not working, it is showing a greenish scrambled image on the screen.</p>
  
  <p>This is the whole source code:</p>
  
  <pre><code>FileInputStream in = new FileInputStream("/sdcard/sample.ts");
  
  String mimeType = "video/avc";
  MediaCodec decoder = MediaCodec.createDecoderByType(mimeType);
  MediaFormat format = MediaFormat.createVideoFormat(mimeType, 1920, 1080);
  
  byte[] header_sps = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, 96, -108 };
  byte[] header_pps = { 0, 0, 0, 1, 104, -18, 60, -128 };
  format.setByteBuffer("csd-0", ByteBuffer.wrap(header_sps));
  format.setByteBuffer("csd-1", ByteBuffer.wrap(header_pps));
  format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080);
  format.setInteger("durationUs", 63446722);
  
  decoder.configure(format, surface, null, 0);
  decoder.start();
  
  ByteBuffer[] inputBuffers = decoder.getInputBuffers();
  ByteBuffer[] outputBuffers = decoder.getOutputBuffers();
  BufferInfo info = new BufferInfo();
  boolean isEOS = false;
  long startMs = System.currentTimeMillis();
  
  while (!Thread.interrupted()) {
      if (!isEOS) {
          int inIndex = decoder.dequeueInputBuffer(1000);
          if (inIndex &gt;= 0) {
              byte buffer2[] = new byte[18800 * 8 * 8 * 8];
              ByteBuffer buffer = inputBuffers[inIndex];
              int sampleSize;
  
              sampleSize = in.read(buffer2, 0, 18800 * 4);
  
              buffer.clear();
              buffer.put(buffer2, 0, sampleSize);
              buffer.clear();
  
              if (sampleSize &lt; 0) {
                  decoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
                  isEOS = true;
              } else {
                  decoder.queueInputBuffer(inIndex, 0, sampleSize, 0, 0);
              }
          }
      }
  
      int outIndex = decoder.dequeueOutputBuffer(info, 10000);
      switch (outIndex) {
      case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
          Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED");
          outputBuffers = decoder.getOutputBuffers();
          break;
      case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
          Log.d("DecodeActivity", "New format " + decoder.getOutputFormat());
          break;
      case MediaCodec.INFO_TRY_AGAIN_LATER:
          Log.d("DecodeActivity", "dequeueOutputBuffer timed out! " + info);
          break;
      default:
          ByteBuffer buffer = outputBuffers[outIndex];
          Log.v("DecodeActivity", "We can't use this buffer but render it due to the API limit, " + buffer);
  
          while (info.presentationTimeUs / 1000 &gt; System.currentTimeMillis() - startMs) {
              try {
                  sleep(10);
              } catch (InterruptedException e) {
                  e.printStackTrace();
                  break;
              }
          }
          decoder.releaseOutputBuffer(outIndex, true);
          break;
      }
  
      if ((info.flags &amp; MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
          Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM");
          break;
      }
  }
  
  decoder.stop();
  decoder.release();
  </code></pre>
  
  <p>If I use the MediaExtractor, everything works fine. I got the SPS/PPS values by looking at the MediaFormat when using MediaExtractor. If I remove the section below, nothing is shown on the screen.</p>
  
  <pre><code>byte[] header_sps = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, 96, -108 };
  byte[] header_pps = { 0, 0, 0, 1, 104, -18, 60, -128 };
  format.setByteBuffer("csd-0", ByteBuffer.wrap(header_sps));
  format.setByteBuffer("csd-1", ByteBuffer.wrap(header_pps));
  format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080);
  format.setInteger("durationUs", 63446722);
  </code></pre>
  
  <p>What I am missing? How can I get the SPS/PPS values programatically without MediaExtractor?</p>