diff --git a/api/current.txt b/api/current.txt
index db77d33..5934594 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -23067,6 +23067,7 @@
     method public final java.lang.String getId();
     method public final java.lang.String getLanguage();
     method public final int getType();
+    method public final byte getVideoActiveFormatDescription();
     method public final float getVideoFrameRate();
     method public final int getVideoHeight();
     method public final float getVideoPixelAspectRatio();
@@ -23086,6 +23087,7 @@
     method public final android.media.tv.TvTrackInfo.Builder setDescription(java.lang.CharSequence);
     method public final android.media.tv.TvTrackInfo.Builder setExtra(android.os.Bundle);
     method public final android.media.tv.TvTrackInfo.Builder setLanguage(java.lang.String);
+    method public final android.media.tv.TvTrackInfo.Builder setVideoActiveFormatDescription(byte);
     method public final android.media.tv.TvTrackInfo.Builder setVideoFrameRate(float);
     method public final android.media.tv.TvTrackInfo.Builder setVideoHeight(int);
     method public final android.media.tv.TvTrackInfo.Builder setVideoPixelAspectRatio(float);
diff --git a/api/system-current.txt b/api/system-current.txt
index 86419ce..3dc4978 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -24852,6 +24852,7 @@
     method public final java.lang.String getId();
     method public final java.lang.String getLanguage();
     method public final int getType();
+    method public final byte getVideoActiveFormatDescription();
     method public final float getVideoFrameRate();
     method public final int getVideoHeight();
     method public final float getVideoPixelAspectRatio();
@@ -24871,6 +24872,7 @@
     method public final android.media.tv.TvTrackInfo.Builder setDescription(java.lang.CharSequence);
     method public final android.media.tv.TvTrackInfo.Builder setExtra(android.os.Bundle);
     method public final android.media.tv.TvTrackInfo.Builder setLanguage(java.lang.String);
+    method public final android.media.tv.TvTrackInfo.Builder setVideoActiveFormatDescription(byte);
     method public final android.media.tv.TvTrackInfo.Builder setVideoFrameRate(float);
     method public final android.media.tv.TvTrackInfo.Builder setVideoHeight(int);
     method public final android.media.tv.TvTrackInfo.Builder setVideoPixelAspectRatio(float);
diff --git a/api/test-current.txt b/api/test-current.txt
index 675b993..ed90474 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -23076,6 +23076,7 @@
     method public final java.lang.String getId();
     method public final java.lang.String getLanguage();
     method public final int getType();
+    method public final byte getVideoActiveFormatDescription();
     method public final float getVideoFrameRate();
     method public final int getVideoHeight();
     method public final float getVideoPixelAspectRatio();
@@ -23095,6 +23096,7 @@
     method public final android.media.tv.TvTrackInfo.Builder setDescription(java.lang.CharSequence);
     method public final android.media.tv.TvTrackInfo.Builder setExtra(android.os.Bundle);
     method public final android.media.tv.TvTrackInfo.Builder setLanguage(java.lang.String);
+    method public final android.media.tv.TvTrackInfo.Builder setVideoActiveFormatDescription(byte);
     method public final android.media.tv.TvTrackInfo.Builder setVideoFrameRate(float);
     method public final android.media.tv.TvTrackInfo.Builder setVideoHeight(int);
     method public final android.media.tv.TvTrackInfo.Builder setVideoPixelAspectRatio(float);
diff --git a/media/java/android/media/tv/TvTrackInfo.java b/media/java/android/media/tv/TvTrackInfo.java
index ed432c46..6a44b1e 100644
--- a/media/java/android/media/tv/TvTrackInfo.java
+++ b/media/java/android/media/tv/TvTrackInfo.java
@@ -52,11 +52,14 @@
     private final int mVideoHeight;
     private final float mVideoFrameRate;
     private final float mVideoPixelAspectRatio;
+    private final byte mVideoActiveFormatDescription;
+
     private final Bundle mExtra;
 
     private TvTrackInfo(int type, String id, String language, CharSequence description,
             int audioChannelCount, int audioSampleRate, int videoWidth, int videoHeight,
-            float videoFrameRate, float videoPixelAspectRatio, Bundle extra) {
+            float videoFrameRate, float videoPixelAspectRatio, byte videoActiveFormatDescription,
+            Bundle extra) {
         mType = type;
         mId = id;
         mLanguage = language;
@@ -67,6 +70,7 @@
         mVideoHeight = videoHeight;
         mVideoFrameRate = videoFrameRate;
         mVideoPixelAspectRatio = videoPixelAspectRatio;
+        mVideoActiveFormatDescription = videoActiveFormatDescription;
         mExtra = extra;
     }
 
@@ -81,6 +85,7 @@
         mVideoHeight = in.readInt();
         mVideoFrameRate = in.readFloat();
         mVideoPixelAspectRatio = in.readFloat();
+        mVideoActiveFormatDescription = in.readByte();
         mExtra = in.readBundle();
     }
 
@@ -179,6 +184,20 @@
     }
 
     /**
+     * Returns the Active Format Description (AFD) code of the video.
+     * Valid only for {@link #TYPE_VIDEO} tracks.
+     *
+     * <p>The complete list of values are defined in ETSI TS 101 154 V1.7.1 Annex B, ATSC A/53 Part
+     * 4 and SMPTE 2016-1-2007.
+     */
+    public final byte getVideoActiveFormatDescription() {
+        if (mType != TYPE_VIDEO) {
+            throw new IllegalStateException("Not a video track");
+        }
+        return mVideoActiveFormatDescription;
+    }
+
+    /**
      * Returns the extra information about the current track.
      */
     public final Bundle getExtra() {
@@ -208,6 +227,7 @@
         dest.writeInt(mVideoHeight);
         dest.writeFloat(mVideoFrameRate);
         dest.writeFloat(mVideoPixelAspectRatio);
+        dest.writeByte(mVideoActiveFormatDescription);
         dest.writeBundle(mExtra);
     }
 
@@ -238,6 +258,7 @@
         private int mVideoHeight;
         private float mVideoFrameRate;
         private float mVideoPixelAspectRatio = 1.0f;
+        private byte mVideoActiveFormatDescription;
         private Bundle mExtra;
 
         /**
@@ -368,6 +389,25 @@
         }
 
         /**
+         * Sets the Active Format Description (AFD) code of the video.
+         * Valid only for {@link #TYPE_VIDEO} tracks.
+         *
+         * <p>This is needed for applications to be able to scale the video properly based on the
+         * information about where in the coded picture the active video is.
+         * The complete list of values are defined in ETSI TS 101 154 V1.7.1 Annex B, ATSC A/53 Part
+         * 4 and SMPTE 2016-1-2007.
+         *
+         * @param videoActiveFormatDescription The AFD code of the video.
+         */
+        public final Builder setVideoActiveFormatDescription(byte videoActiveFormatDescription) {
+            if (mType != TYPE_VIDEO) {
+                throw new IllegalStateException("Not a video track");
+            }
+            mVideoActiveFormatDescription = videoActiveFormatDescription;
+            return this;
+        }
+
+        /**
          * Sets the extra information about the current track.
          *
          * @param extra The extra information.
@@ -385,7 +425,7 @@
         public TvTrackInfo build() {
             return new TvTrackInfo(mType, mId, mLanguage, mDescription, mAudioChannelCount,
                     mAudioSampleRate, mVideoWidth, mVideoHeight, mVideoFrameRate,
-                    mVideoPixelAspectRatio, mExtra);
+                    mVideoPixelAspectRatio, mVideoActiveFormatDescription, mExtra);
         }
     }
 }
