text: /*
   * Copyright 2015, The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  #include "android_media_SyncParams.h"
  
  #include <nativehelper/JNIHelp.h>
  
  namespace android {
  
  void SyncParams::fields_t::init(JNIEnv *env) {
      jclass lclazz = env->FindClass("android/media/SyncParams");
      if (lclazz == NULL) {
          return;
      }
  
      clazz = (jclass)env->NewGlobalRef(lclazz);
      if (clazz == NULL) {
          return;
      }
  
      constructID = env->GetMethodID(clazz, "<init>", "()V");
  
      sync_source = env->GetFieldID(clazz, "mSyncSource", "I");
      audio_adjust_mode = env->GetFieldID(clazz, "mAudioAdjustMode", "I");
      tolerance = env->GetFieldID(clazz, "mTolerance", "F");
      frame_rate = env->GetFieldID(clazz, "mFrameRate", "F");
      set = env->GetFieldID(clazz, "mSet", "I");
  
      set_sync_source =
          env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "SET_SYNC_SOURCE", "I"));
      set_audio_adjust_mode = env->GetStaticIntField(
              clazz, env->GetStaticFieldID(clazz, "SET_AUDIO_ADJUST_MODE", "I"));
      set_tolerance =
          env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "SET_TOLERANCE", "I"));
      set_frame_rate =
          env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "SET_FRAME_RATE", "I"));
  
      env->DeleteLocalRef(lclazz);
  }
  
  void SyncParams::fields_t::exit(JNIEnv *env) {
      env->DeleteGlobalRef(clazz);
      clazz = NULL;
  }
  
  void SyncParams::fillFromJobject(JNIEnv *env, const fields_t& fields, jobject params) {
      sync.mSource = (AVSyncSource)env->GetIntField(params, fields.sync_source);
      sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)env->GetIntField(params, fields.audio_adjust_mode);
      sync.mTolerance = env->GetFloatField(params, fields.tolerance);
      frameRate = env->GetFloatField(params, fields.frame_rate);
      int set = env->GetIntField(params, fields.set);
  
      syncSourceSet = set & fields.set_sync_source;
      audioAdjustModeSet = set & fields.set_audio_adjust_mode;
      toleranceSet = set & fields.set_tolerance;
      frameRateSet = set & fields.set_frame_rate;
  }
  
  jobject SyncParams::asJobject(JNIEnv *env, const fields_t& fields) {
      jobject params = env->NewObject(fields.clazz, fields.constructID);
      if (params == NULL) {
          return NULL;
      }
      env->SetIntField(params, fields.sync_source, (jint)sync.mSource);
      env->SetIntField(params, fields.audio_adjust_mode, (jint)sync.mAudioAdjustMode);
      env->SetFloatField(params, fields.tolerance, (jfloat)sync.mTolerance);
      env->SetFloatField(params, fields.frame_rate, (jfloat)frameRate);
      env->SetIntField(
              params, fields.set,
              (syncSourceSet ? fields.set_sync_source : 0)
                      | (audioAdjustModeSet ? fields.set_audio_adjust_mode : 0)
                      | (toleranceSet ? fields.set_tolerance : 0)
                      | (frameRateSet ? fields.set_frame_rate : 0));
  
      return params;
  }
  
  }  // namespace android
  