1313
1414import org .json .JSONObject ;
1515
16- import java .util . concurrent . atomic . AtomicReference ;
16+ import java .lang . reflect . Field ;
1717
1818import de .robv .android .xposed .XC_MethodHook ;
1919import de .robv .android .xposed .XC_MethodReplacement ;
@@ -49,33 +49,50 @@ public void doHook() throws Exception {
4949
5050 Others .propsBoolean .put (5549 , true ); // Use bitrate from json to force video high quality
5151
52- var jsonProperty = Unobfuscator .loadPropsJsonMethod (classLoader );
52+ var processVideoQualityClass = Unobfuscator .loadProcessVideoQualityClass (classLoader );
53+ var processVideoQualityFields = Unobfuscator .loadProcessVideoQualityFields (classLoader );
5354
54- AtomicReference <XC_MethodHook .Unhook > jsonPropertyHook = new AtomicReference <>();
55-
56- var unhooked = XposedBridge .hookMethod (jsonProperty , new XC_MethodHook () {
55+ XposedBridge .hookAllConstructors (processVideoQualityClass , new XC_MethodHook () {
5756 @ Override
5857 protected void afterHookedMethod (MethodHookParam param ) throws Throwable {
59- var value = ReflectionUtils .getArg (param .args , Integer .class , 0 );
60- if (value == 5550 ) {
61- JSONObject videoBitrateData = new JSONObject ();
62- String [] resolutions = {"360" , "480" , "720" , "1080" };
63- for (String resolution : resolutions ) {
64- JSONObject resolutionData = new JSONObject ();
65- resolutionData .put ("min_bitrate" , 3000 );
66- resolutionData .put ("max_bitrate" , 96000 );
67- resolutionData .put ("null_bitrate" , 96000 );
68- resolutionData .put ("min_bandwidth" , 1 );
69- resolutionData .put ("max_bandwidth" , 1 );
70- videoBitrateData .put (resolution , resolutionData );
71- }
72- param .setResult (videoBitrateData );
73- } else if (value == 9705 ) {
74- param .setResult (new JSONObject ());
75- }
58+ Field videoMaxEdge = processVideoQualityFields .get ("videoMaxEdge" );
59+ videoMaxEdge .setInt (param .thisObject , 8000 );
60+ Field videoMaxBitrate = processVideoQualityFields .get ("videoMaxBitrate" );
61+ videoMaxBitrate .setInt (param .thisObject , 96000000 );
7662 }
7763 });
78- jsonPropertyHook .set (unhooked );
64+
65+
66+ // var jsonProperty = Unobfuscator.loadPropsJsonMethod(classLoader);
67+ //
68+ // AtomicReference<XC_MethodHook.Unhook> jsonPropertyHook = new AtomicReference<>();
69+ //
70+ // var unhooked = XposedBridge.hookMethod(jsonProperty, new XC_MethodHook() {
71+ // @Override
72+ // protected void afterHookedMethod(MethodHookParam param) throws Throwable {
73+ // var value = ReflectionUtils.getArg(param.args, Integer.class, 0);
74+ // if (value == 5550) {
75+ // JSONObject videoBitrateData = new JSONObject();
76+ // String[] resolutions = {"360", "480", "720", "1080"};
77+ // int[] minBitrates = {1500, 2500, 10000, 16000};
78+ // int[] maxBitrates = {2500, 4000, 16000, 24000};
79+ // for (int i = 0; i < resolutions.length; i++) {
80+ // String resolution = resolutions[i];
81+ // JSONObject resolutionData = new JSONObject();
82+ // resolutionData.put("min_bitrate", minBitrates[i]);
83+ // resolutionData.put("max_bitrate", maxBitrates[i]);
84+ // resolutionData.put("null_bitrate", maxBitrates[i]);
85+ // resolutionData.put("min_bandwidth", 1);
86+ // resolutionData.put("max_bandwidth", 1);
87+ // videoBitrateData.put(resolution, resolutionData);
88+ // }
89+ // param.setResult(videoBitrateData);
90+ // } else if (value == 9705) {
91+ // param.setResult(new JSONObject());
92+ // }
93+ // }
94+ // });
95+ // jsonPropertyHook.set(unhooked);
7996
8097 var videoMethod = Unobfuscator .loadMediaQualityVideoMethod2 (classLoader );
8198 logDebug (Unobfuscator .getMethodDescriptor (videoMethod ));
@@ -108,9 +125,9 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
108125
109126 if (mediaFields .isEmpty ()) {
110127 if (isEnum ) {
111- width = intParams .get (0 ).second ;
112- height = intParams .get (1 ).second ;
113- rotationAngle = intParams .get (2 ).second ;
128+ width = intParams .get (intParams . size () - 3 ).second ;
129+ height = intParams .get (intParams . size () - 2 ).second ;
130+ rotationAngle = intParams .get (intParams . size () - 1 ).second ;
114131 } else {
115132 JSONObject mediaFields = (JSONObject ) XposedHelpers .callMethod (param .args [0 ], "A00" );
116133 width = mediaFields .getInt ("widthPx" );
@@ -131,13 +148,13 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
131148 targetWidthField .setInt (resizeVideo , inverted ? height : width );
132149
133150 }
134-
135151 }
136152 if (prefs .getBoolean ("video_maxfps" , false )) {
137153 var frameRateField = mediaTranscodeParams .get ("frameRate" );
138154 frameRateField .setInt (resizeVideo , 60 );
139155 }
140156 }
157+
141158 });
142159
143160 // HD video must be sent in maximum resolution (up to 4K)
@@ -204,4 +221,4 @@ public String getPluginName() {
204221 return "Media Quality" ;
205222 }
206223
207- }
224+ }
0 commit comments