@@ -425,8 +425,12 @@ VideoTrack createVideoTrack(AbstractVideoCaptureController videoCaptureControlle
425425
426426 VideoTrack track = pcFactory .createVideoTrack (id , videoSource );
427427
428+ // Add dimension detection for local video tracks immediately when created
429+ VideoTrackAdapter localTrackAdapter = new VideoTrackAdapter (webRTCModule , -1 ); // Use -1 for local tracks
430+ localTrackAdapter .addDimensionDetector (track );
431+
428432 track .setEnabled (true );
429- tracks .put (id , new TrackPrivate (track , videoSource , videoCaptureController , surfaceTextureHelper ));
433+ tracks .put (id , new TrackPrivate (track , videoSource , videoCaptureController , surfaceTextureHelper , localTrackAdapter ));
430434
431435 videoCaptureController .startCapture ();
432436
@@ -444,8 +448,14 @@ MediaStreamTrack cloneTrack(String trackId) {
444448 String id = UUID .randomUUID ().toString ();
445449 MediaStreamTrack nativeTrack = track .track ;
446450 final MediaStreamTrack clonedNativeTrack ;
451+ VideoTrackAdapter clonedVideoTrackAdapter = null ;
452+
447453 if (nativeTrack instanceof VideoTrack ) {
448454 clonedNativeTrack = pcFactory .createVideoTrack (id , (VideoSource ) track .mediaSource );
455+
456+ // Create dimension detection for cloned video tracks
457+ clonedVideoTrackAdapter = new VideoTrackAdapter (webRTCModule , -1 );
458+ clonedVideoTrackAdapter .addDimensionDetector ((VideoTrack ) clonedNativeTrack );
449459 } else {
450460 clonedNativeTrack = pcFactory .createAudioTrack (id , (AudioSource ) track .mediaSource );
451461 }
@@ -455,7 +465,8 @@ MediaStreamTrack cloneTrack(String trackId) {
455465 clonedNativeTrack ,
456466 track .mediaSource ,
457467 track .videoCaptureController ,
458- track .surfaceTextureHelper
468+ track .surfaceTextureHelper ,
469+ clonedVideoTrackAdapter
459470 );
460471 clone .setParent (track );
461472 tracks .put (id , clone );
@@ -519,6 +530,11 @@ private static class TrackPrivate {
519530
520531 private final SurfaceTextureHelper surfaceTextureHelper ;
521532
533+ /**
534+ * The {@code VideoTrackAdapter} for dimension detection if {@link #track} is a {@link VideoTrack}.
535+ */
536+ public final VideoTrackAdapter videoTrackAdapter ;
537+
522538 /**
523539 * Whether this object has been disposed or not.
524540 */
@@ -538,16 +554,28 @@ private static class TrackPrivate {
538554 * @param videoCaptureController the {@code AbstractVideoCaptureController} from which the
539555 * specified {@code mediaSource} was created if the specified
540556 * {@code track} is a {@link VideoTrack}
557+ * @param surfaceTextureHelper the {@code SurfaceTextureHelper} for video rendering
558+ * @param videoTrackAdapter the {@code VideoTrackAdapter} for dimension detection if video track
541559 */
542560 public TrackPrivate (MediaStreamTrack track , MediaSource mediaSource ,
543- AbstractVideoCaptureController videoCaptureController , SurfaceTextureHelper surfaceTextureHelper ) {
561+ AbstractVideoCaptureController videoCaptureController , SurfaceTextureHelper surfaceTextureHelper ,
562+ VideoTrackAdapter videoTrackAdapter ) {
544563 this .track = track ;
545564 this .mediaSource = mediaSource ;
546565 this .videoCaptureController = videoCaptureController ;
547566 this .surfaceTextureHelper = surfaceTextureHelper ;
567+ this .videoTrackAdapter = videoTrackAdapter ;
548568 this .disposed = false ;
549569 }
550570
571+ /**
572+ * Backwards compatibility constructor for audio tracks
573+ */
574+ public TrackPrivate (MediaStreamTrack track , MediaSource mediaSource ,
575+ AbstractVideoCaptureController videoCaptureController , SurfaceTextureHelper surfaceTextureHelper ) {
576+ this (track , mediaSource , videoCaptureController , surfaceTextureHelper , null );
577+ }
578+
551579 public void dispose () {
552580 final boolean isClone = this .isClone ();
553581 if (!disposed ) {
@@ -557,6 +585,11 @@ public void dispose() {
557585 }
558586 }
559587
588+ // Clean up VideoTrackAdapter for video tracks
589+ if (!isClone && videoTrackAdapter != null && track instanceof VideoTrack ) {
590+ videoTrackAdapter .removeDimensionDetector ((VideoTrack ) track );
591+ }
592+
560593 /*
561594 * As per webrtc library documentation - The caller still has ownership of {@code
562595 * surfaceTextureHelper} and is responsible for making sure surfaceTextureHelper.dispose() is
0 commit comments