Program: 35747
Project: 35747
Buggy source:
public boolean start() throws IOException {
synchronized (PROCESS_LOCK) {
    if (!isStarted) {
      if (!prepare()) {
        Log.e(Aavt.debugTag,"String_Node_Str");
        return false;
      }
      isVideoExtractorEnd=false;
      isVideoExtractorEnd=false;
      mGLThreadFlag=true;
      mVideoDecoder.start();
      if (!isRenderToWindowSurface) {
        mVideoEncoder.start();
      }
      mGLThread=new Thread(new Runnable(){
        @Override public void run(){
          glRunnable();
        }
      }
);
      mGLThread.start();
      mCodecFlag=true;
      mDecodeThread=new Thread(new Runnable(){
        @Override public void run(){
          if (mVideoDecoderTrack >= 0) {
            while (mCodecFlag && !videoDecodeStep())             ;
            mGLThreadFlag=false;
            try {
              mSem.release();
              mGLThread.join();
            }
 catch (            InterruptedException e) {
              e.printStackTrace();
            }
          }
          if (mAudioDecoderTrack >= 0) {
            ByteBuffer buffer=ByteBuffer.allocate(1024 * 32);
            while (mCodecFlag && !audioDecodeStep(buffer))             ;
            buffer.clear();
          }
          mMuxer.stop();
          if (mCompleteListener != null && mCodecFlag) {
            mCompleteListener.onComplete(mOutputPath);
          }
          Log.d(Aavt.debugTag,"String_Node_Str");
          mCodecFlag=false;
          try {
            stop();
          }
 catch (          InterruptedException e) {
            Log.e(Aavt.debugTag,"String_Node_Str");
            e.printStackTrace();
          }
        }
      }
);
      mDecodeThread.start();
      isStarted=true;
    }
  }
  return true;
}

Fixed version (ground truth):
public boolean start() throws IOException {
synchronized (PROCESS_LOCK) {
    if (!isStarted) {
      if (!prepare()) {
        Log.e(Aavt.debugTag,"String_Node_Str");
        return false;
      }
      isUserWantToStop=false;
      isVideoExtractorEnd=false;
      isVideoExtractorEnd=false;
      mGLThreadFlag=true;
      mVideoDecoder.start();
      if (!isRenderToWindowSurface) {
        mVideoEncoder.start();
      }
      mGLThread=new Thread(new Runnable(){
        @Override public void run(){
          glRunnable();
        }
      }
);
      mGLThread.start();
      mCodecFlag=true;
      mDecodeThread=new Thread(new Runnable(){
        @Override public void run(){
          if (mVideoDecoderTrack >= 0) {
            Log.d(Aavt.debugTag,"String_Node_Str");
            while (mCodecFlag && !videoDecodeStep())             ;
            Log.d(Aavt.debugTag,"String_Node_Str");
            mGLThreadFlag=false;
            try {
              mSem.release();
              mGLThread.join();
            }
 catch (            InterruptedException e) {
              e.printStackTrace();
            }
          }
          if (mAudioDecoderTrack >= 0 && mVideoEncoderTrack >= 0) {
            ByteBuffer buffer=ByteBuffer.allocate(1024 * 32);
            while (mCodecFlag && !audioDecodeStep(buffer))             ;
            buffer.clear();
          }
          Log.d(Aavt.debugTag,"String_Node_Str");
          mCodecFlag=false;
          avStop();
          if (mCompleteListener != null) {
            mCompleteListener.onComplete(mOutputPath);
          }
        }
      }
);
      mDecodeThread.start();
      isStarted=true;
    }
  }
  return true;
}