Program: 35739
Project: 35739
Buggy source:
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");
            codecNum=0;
            while (mCodecFlag && !videoDecodeStep()) {
            }
            ;
            Log.d(Aavt.debugTag,"String_Node_Str" + codecNum);
            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 (mProgressListener != null) {
            mProgressListener.onComplete(mOutputPath);
          }
        }
      }
);
      mDecodeThread.start();
      isStarted=true;
    }
  }
  return true;
}

Fixed version (ground truth):
public boolean start() throws IOException {
synchronized (PROCESS_LOCK) {
    if (!isStarted) {
      if (!prepare()) {
        AvLog.d("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) {
            AvLog.d("String_Node_Str");
            codecNum=0;
            while (mCodecFlag && !videoDecodeStep()) {
            }
            ;
            AvLog.d("String_Node_Str" + codecNum);
            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();
          }
          AvLog.d("String_Node_Str");
          mCodecFlag=false;
          avStop();
          if (mProgressListener != null) {
            mProgressListener.onComplete(mOutputPath);
          }
        }
      }
);
      mDecodeThread.start();
      isStarted=true;
    }
  }
  return true;
}