Automate conversion from c++ VideoCodeType to java VideoCodecType

Bug: b/148146536
Change-Id: I030c7c6c2a1a9d002bcc60f45c8d6025bd0935b8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/167301
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30751}
diff --git a/api/video/BUILD.gn b/api/video/BUILD.gn
index aaa0d56..3aae5fb 100644
--- a/api/video/BUILD.gn
+++ b/api/video/BUILD.gn
@@ -7,6 +7,10 @@
 # be found in the AUTHORS file in the root of the source tree.
 
 import("../../webrtc.gni")
+if (is_android) {
+  import("//build/config/android/config.gni")
+  import("//build/config/android/rules.gni")
+}
 
 rtc_library("video_rtp_headers") {
   visibility = [ "*" ]
@@ -56,6 +60,12 @@
   ]
 }
 
+if (is_android) {
+  java_cpp_enum("video_frame_enums") {
+    sources = [ "video_codec_type.h" ]
+  }
+}
+
 rtc_source_set("recordable_encoded_frame") {
   visibility = [ "*" ]
   sources = [ "recordable_encoded_frame.h" ]
diff --git a/api/video/video_codec_type.h b/api/video/video_codec_type.h
index efbe3cc..12dcfac 100644
--- a/api/video/video_codec_type.h
+++ b/api/video/video_codec_type.h
@@ -13,7 +13,7 @@
 
 namespace webrtc {
 
-// Video codec types
+// GENERATED_JAVA_ENUM_PACKAGE: org.webrtc
 enum VideoCodecType {
   // There are various memset(..., 0, ...) calls in the code that rely on
   // kVideoCodecGeneric being zero.
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 1a5dc82..9ee4216 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -327,6 +327,7 @@
       "//rtc_base:base_java",
       "//third_party/android_deps:com_android_support_support_annotations_java",
     ]
+    srcjar_deps = [ "//api/video:video_frame_enums" ]
   }
 
   # Modules, in alphabetical order.
diff --git a/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java b/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java
index 8c91de0..5b51df2 100644
--- a/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java
+++ b/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java
@@ -134,20 +134,6 @@
   private static final String FORMAT_KEY_CROP_TOP = "crop-top";
   private static final String FORMAT_KEY_CROP_BOTTOM = "crop-bottom";
 
-  // Tracks webrtc::VideoCodecType.
-  public enum VideoCodecType {
-    VIDEO_CODEC_UNKNOWN,
-    VIDEO_CODEC_VP8,
-    VIDEO_CODEC_VP9,
-    VIDEO_CODEC_AV1,
-    VIDEO_CODEC_H264;
-
-    @CalledByNative("VideoCodecType")
-    static VideoCodecType fromNativeIndex(int nativeIndex) {
-      return values()[nativeIndex];
-    }
-  }
-
   // Timeout for input buffer dequeue.
   private static final int DEQUEUE_INPUT_TIMEOUT = 500000;
   // Timeout for codec releasing.
@@ -423,7 +409,7 @@
   }
 
   @CalledByNativeUnchecked
-  private boolean initDecode(VideoCodecType type, int width, int height) {
+  private boolean initDecode(@VideoCodecType int type, int width, int height) {
     if (mediaCodecThread != null) {
       throw new RuntimeException("initDecode: Forgot to release()?");
     }
diff --git a/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java b/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java
index 5f5d44b..1c9bc42 100644
--- a/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java
+++ b/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java
@@ -135,20 +135,6 @@
     }
   }
 
-  // Tracks webrtc::VideoCodecType.
-  public enum VideoCodecType {
-    VIDEO_CODEC_UNKNOWN,
-    VIDEO_CODEC_VP8,
-    VIDEO_CODEC_VP9,
-    VIDEO_CODEC_AV1,
-    VIDEO_CODEC_H264;
-
-    @CalledByNative("VideoCodecType")
-    static VideoCodecType fromNativeIndex(int nativeIndex) {
-      return values()[nativeIndex];
-    }
-  }
-
   private static final int MEDIA_CODEC_RELEASE_TIMEOUT_MS = 5000; // Timeout for codec releasing.
   private static final int DEQUEUE_TIMEOUT = 0; // Non-blocking, no wait.
   private static final int BITRATE_ADJUSTMENT_FPS = 30;
@@ -331,7 +317,7 @@
       CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar,
       COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m};
   private static final int[] supportedSurfaceColorList = {CodecCapabilities.COLOR_FormatSurface};
-  private VideoCodecType type;
+  @VideoCodecType private int type;
   private int colorFormat;
 
   // Variables used for dynamic bitrate adjustment.
@@ -559,8 +545,8 @@
   }
 
   @CalledByNativeUnchecked
-  boolean initEncode(VideoCodecType type, int profile, int width, int height, int kbps, int fps,
-      boolean useSurface) {
+  boolean initEncode(@VideoCodecType int type, int profile, int width, int height, int kbps,
+      int fps, boolean useSurface) {
     Logging.d(TAG,
         "Java initEncode: " + type + ". Profile: " + profile + " : " + width + " x " + height
             + ". @ " + kbps + " kbps. Fps: " + fps + ". Encode from texture : " + useSurface);
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java b/sdk/android/instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java
index 7693b59..7182f48 100644
--- a/sdk/android/instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java
+++ b/sdk/android/instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java
@@ -38,8 +38,8 @@
       return;
     }
     MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        640, 480, 300, 30, /* useSurface= */ false));
+    assertTrue(encoder.initEncode(
+        VideoCodecType.VIDEO_CODEC_VP8, profile, 640, 480, 300, 30, /* useSurface= */ false));
     encoder.release();
   }
 
@@ -53,8 +53,8 @@
     EglBase14 eglBase = EglBase.createEgl14(EglBase.CONFIG_PLAIN);
     MediaCodecVideoEncoder.setEglContext(eglBase.getEglBaseContext());
     MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        640, 480, 300, 30, /* useSurface= */ true));
+    assertTrue(encoder.initEncode(
+        VideoCodecType.VIDEO_CODEC_VP8, profile, 640, 480, 300, 30, /* useSurface= */ true));
     encoder.release();
     MediaCodecVideoEncoder.disposeEglContext();
     eglBase.release();
@@ -68,13 +68,13 @@
       return;
     }
     MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        640, 480, 300, 30, /* useSurface= */ false));
+    assertTrue(encoder.initEncode(
+        VideoCodecType.VIDEO_CODEC_VP8, profile, 640, 480, 300, 30, /* useSurface= */ false));
     encoder.release();
     EglBase14 eglBase = EglBase.createEgl14(EglBase.CONFIG_PLAIN);
     MediaCodecVideoEncoder.setEglContext(eglBase.getEglBaseContext());
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        640, 480, 300, 30, /* useSurface= */ true));
+    assertTrue(encoder.initEncode(
+        VideoCodecType.VIDEO_CODEC_VP8, profile, 640, 480, 300, 30, /* useSurface= */ true));
     encoder.release();
     MediaCodecVideoEncoder.disposeEglContext();
     eglBase.release();
@@ -95,8 +95,8 @@
 
     MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
 
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        width, height, 300, 30, /* useSurface= */ false));
+    assertTrue(encoder.initEncode(
+        VideoCodecType.VIDEO_CODEC_VP8, profile, width, height, 300, 30, /* useSurface= */ false));
     ByteBuffer[] inputBuffers = encoder.getInputBuffers();
     assertNotNull(inputBuffers);
     assertTrue(min_size <= inputBuffers[0].capacity());
diff --git a/sdk/android/src/jni/android_media_decoder.cc b/sdk/android/src/jni/android_media_decoder.cc
index 94ce42d..7c731ce 100644
--- a/sdk/android/src/jni/android_media_decoder.cc
+++ b/sdk/android/src/jni/android_media_decoder.cc
@@ -213,10 +213,8 @@
 
   ResetVariables();
 
-  ScopedJavaLocalRef<jobject> j_video_codec_enum =
-      Java_VideoCodecType_fromNativeIndex(jni, codecType_);
   bool success = Java_MediaCodecVideoDecoder_initDecode(
-      jni, j_media_codec_video_decoder_, j_video_codec_enum, codec_.width,
+      jni, j_media_codec_video_decoder_, codecType_, codec_.width,
       codec_.height);
 
   if (CheckException(jni) || !success) {
diff --git a/sdk/android/src/jni/android_media_encoder.cc b/sdk/android/src/jni/android_media_encoder.cc
index 4b4ad10..8db368b 100644
--- a/sdk/android/src/jni/android_media_encoder.cc
+++ b/sdk/android/src/jni/android_media_encoder.cc
@@ -512,11 +512,9 @@
   frames_received_since_last_key_ = kMinKeyFrameInterval;
 
   // We enforce no extra stride/padding in the format creation step.
-  ScopedJavaLocalRef<jobject> j_video_codec_enum =
-      Java_VideoCodecType_fromNativeIndex(jni, codec_type);
   const bool encode_status = Java_MediaCodecVideoEncoder_initEncode(
-      jni, j_media_codec_video_encoder_, j_video_codec_enum, profile_, width,
-      height, kbps, fps, use_surface);
+      jni, j_media_codec_video_encoder_, codec_type, profile_, width, height,
+      kbps, fps, use_surface);
 
   if (!encode_status) {
     ALOGE << "Failed to configure encoder.";