diff --git wp-includes/formatting.php wp-includes/formatting.php
index c162a35..c2d2a11 100644
--- wp-includes/formatting.php
+++ wp-includes/formatting.php
@@ -1943,6 +1943,50 @@ function post_formats_compat( $content, $id = 0 ) {
 						// attempt to embed the URL
 						$format_output .= sprintf( '[embed]%s[/embed]', $meta['media'] );
 					}
+				} elseif ( empty( $meta['media'] ) ) {
+					$data = '';
+					// attempt to grab an embed code or URL from the content
+					if ( 'audio' === $format ) {
+						$data = get_content_audio( $content, true );
+					} elseif ( 'video' === $format ) {
+						$data = get_content_video( $content, true );
+					}
+
+					if ( ! empty( $data ) ) {
+						// attempt to embed the URL
+						if ( 0 === stripos( $data, 'http' ) )
+							$format_output .= sprintf( '[embed]%s[/embed]', $data );
+						else // data is probably an embed code
+							$format_output .= $data;
+					} elseif ( 'audio' === $format ) {
+						// get attached audio URL
+						$audios = get_post_audio( $post->ID );
+						if ( ! empty( $audios ) ) {
+							$audio = reset( $audios );
+							$url = wp_get_attachment_url( $audio->ID );
+							// core or plugin support for [audio]
+							if ( shortcode_exists( 'audio' ) ) {
+								$format_output .= sprintf( '[audio src="%s"/]', $url );
+							} else {
+								// no support detected, just add URL
+								$format_output .= sprintf( '<a href="%1$s">%1$s</a>', $url );
+							}
+						}
+					} elseif ( 'video' === $format ) {
+						// get attached video URL
+						$videos = get_post_video( $post->ID );
+						if ( ! empty( $videos ) ) {
+							$video = reset( $videos );
+							$url = wp_get_attachment_url( $video->ID );
+							// core or plugin support for [video]
+							if ( shortcode_exists( 'video' ) ) {
+								$format_output .= sprintf( '[video src="%s"/]', $url );
+							} else {
+								// no support detected, just add URL link
+								$format_output .= sprintf( '<a href="%1$s">%1$s</a>', $url );
+							}
+						}
+					}
 				}
 			}
 			break;
@@ -3531,7 +3575,7 @@ function sanitize_trackback_urls( $to_ping ) {
  * @return string|array Slashed $value
  */
 function wp_slash( $value ) {
-	if ( is_array( $value ) ) { 
+	if ( is_array( $value ) ) {
 		foreach ( $value as $k => $v ) {
 			if ( is_array( $v ) ) {
 				$value[$k] = wp_slash( $v );
@@ -3540,10 +3584,10 @@ function wp_slash( $value ) {
 			}
 		}
 	} else {
-		$value = addslashes( $value ); 
-	} 
+		$value = addslashes( $value );
+	}
 
-	return $value; 
+	return $value;
 }
 
 /**
@@ -3562,5 +3606,5 @@ function wp_slash( $value ) {
  * @return string|array Unslashed $value
  */
 function wp_unslash( $value ) {
-	return stripslashes_deep( $value ); 
-}
+	return stripslashes_deep( $value );
+}
\ No newline at end of file
diff --git wp-includes/functions.php wp-includes/functions.php
index cbd7925..5ac68c7 100644
--- wp-includes/functions.php
+++ wp-includes/functions.php
@@ -3883,4 +3883,24 @@ function wp_is_stream( $path ) {
  */
 function wp_checkdate( $month, $day, $year, $source_date ) {
 	return apply_filters( 'wp_checkdate', checkdate( $month, $day, $year ), $source_date );
+}
+
+/**
+ * Return RegEx body to liberally match an opening HTML tag that:
+ * 1. Is self-closing or
+ * 2. Has no body but has a closing tag of the same name or
+ * 3. Contains a body and a closing tag of the same name
+ *
+ * Note: this RegEx does not balance inner tags and does not attempt to produce valid HTML
+ *
+ * @since 3.6.0
+ *
+ * @param string $tag An HTML tag name. Example: 'video'
+ * @return string
+ */
+function get_tag_regex( $tag ) {
+	if ( empty( $tag ) )
+		return;
+
+	return sprintf( '(<%1$s[^>]*(?:/?>$|>[\s\S]*?</%1$s>))', tag_escape( $tag ) );
 }
\ No newline at end of file
diff --git wp-includes/media.php wp-includes/media.php
index f1f3737..895edbf 100644
--- wp-includes/media.php
+++ wp-includes/media.php
@@ -1542,3 +1542,185 @@ function wp_enqueue_media( $args = array() ) {
 
 	do_action( 'wp_enqueue_media' );
 }
+
+/**
+ * Retrieve audio attached to the passed post
+ *
+ * @since 3.6.0
+ *
+ * @param int $post_id  Post ID
+ * @return array Found audio attachments
+ */
+function get_post_audio( $post_id = 0 ) {
+	$post = empty( $post_id ) ? get_post() : get_post( $post_id );
+	if ( empty( $post ) )
+		return;
+
+	$children = get_children( array(
+		'post_parent' => $post->ID,
+		'post_type' => 'attachment',
+		'post_mime_type' => 'audio',
+		'posts_per_page' => -1
+	) );
+
+	if ( ! empty( $children ) )
+		return $children;
+}
+
+/**
+ * Check the content blob for an <audio>, <object>, <embed>, or <iframe>, in that order
+ * If no HTML tag is found, check the first line of the post for a URL
+ *
+ * @param string $content A string which might contain audio data.
+ * @param boolean $remove Whether to remove the found URL from the passed content.
+ * @return string The found data
+ */
+function get_content_audio( &$content, $remove = false ) {
+	$html = $matches = '';
+	foreach ( array( 'audio', 'object', 'embed', 'iframe' ) as $tag ) {
+		if ( preg_match( '#' . get_tag_regex( $tag ) . '#', $content, $matches ) ) {
+			$html = $matches[1];
+			if ( $remove )
+				$content = str_replace( $matches[0], '', $content );
+
+			return $html;
+		}
+	}
+
+	$lines = explode( "\n", trim( $content ) );
+	$line = trim( array_shift( $lines  ) );
+
+	if ( 0 === stripos( $line, 'http' ) ) {
+		if ( $remove )
+			$content = join( "\n", $lines );
+
+		return $line;
+	}
+}
+
+/**
+ * Return the found audio data for the passed post
+ *
+ * @since 3.6.0
+ *
+ * @param int $id Optional. Post ID
+ */
+function get_the_audio( $id = 0 ) {
+	$post = empty( $id ) ? get_post() : get_post( $id );
+	if ( empty( $post ) )
+		return;
+
+	if ( shortcode_exists( 'audio' ) )
+		return do_shortcode( '[audio /]' );
+
+	$data = get_content_audio( $post->post_content );
+	if ( ! empty( $data ) )
+		return $data;
+
+	$audios = get_post_audio( $post->ID );
+	if ( empty( $audios ) )
+		return;
+
+	$audio = reset( $audios );
+	return wp_get_attachment_url( $audio->ID );
+}
+
+/**
+ * Output the found audio data for the current post
+ *
+ * @since 3.6.0
+ */
+function the_audio() {
+	echo apply_filters( 'the_audio', get_the_audio() );
+}
+
+/**
+ * Retrieve video attached to the passed post
+ *
+ * @since 3.6.0
+ *
+ * @param int $post_id  Post ID
+ * @return array Found video attachments
+ */
+function get_post_video( $post_id = 0 ) {
+	$post = empty( $post_id ) ? get_post() : get_post( $post_id );
+	if ( empty( $post ) )
+		return;
+
+	$children = get_children( array(
+		'post_parent' => $post->ID,
+		'post_type' => 'attachment',
+		'post_mime_type' => 'video',
+		'posts_per_page' => -1
+	) );
+
+	if ( ! empty( $children ) )
+		return $children;
+}
+
+/**
+ * Check the content blob for a <video>, <object>, <embed>, or <iframe>, in that order
+ * If no HTML tag is found, check the first line of the post for a URL
+ *
+ * @param string $content A string which might contain video data.
+ * @param boolean $remove Whether to remove the found URL from the passed content.
+ * @return string The found data
+ */
+function get_content_video( &$content, $remove = false ) {
+	$html = $matches = '';
+	foreach ( array( 'video', 'object', 'embed', 'iframe' ) as $tag ) {
+		if ( preg_match( '#' . get_tag_regex( $tag ) . '#', $content, $matches ) ) {
+			$html = $matches[1];
+			if ( $remove )
+				$content = str_replace( $matches[0], '', $content );
+
+			return $html;
+		}
+	}
+
+	$lines = explode( "\n", trim( $content ) );
+	$line = trim( array_shift( $lines  ) );
+
+	if ( 0 === stripos( $line, 'http' ) ) {
+		if ( $remove )
+			$content = join( "\n", $lines );
+
+		return $line;
+	}
+}
+
+/**
+ * Return the found video data for the passed post
+ *
+ * @since 3.6.0
+ *
+ * @param int $id Optional. Post ID
+ */
+function get_the_video( $id = 0 ) {
+	$post = empty( $id ) ? get_post() : get_post( $id );
+	if ( empty( $post ) )
+		return;
+
+	if ( shortcode_exists( 'video' ) )
+		return do_shortcode( '[video /]' );
+
+	$data = get_content_video( $post->post_content );
+	if ( ! empty( $data ) )
+		return $data;
+
+	$videos = get_post_video( $post->ID );
+	if ( empty( $videos ) )
+		return;
+
+	$video = reset( $videos );
+	return wp_get_attachment_url( $video->ID );
+}
+
+/**
+ * Output the found video data for the current post
+ *
+ * @since 3.6.0
+ */
+function the_video() {
+	echo apply_filters( 'the_video', get_the_video() );
+}
\ No newline at end of file
diff --git wp-includes/shortcodes.php wp-includes/shortcodes.php
index 2dfc277..716dae4 100644
--- wp-includes/shortcodes.php
+++ wp-includes/shortcodes.php
@@ -128,6 +128,20 @@ function remove_all_shortcodes() {
 }
 
 /**
+ * Whether a registered shortcode exists named $tag
+ *
+ * @since 3.6.0
+ *
+ * @global array $shortcode_tags
+ * @param string $tag
+ * @return boolean
+ */
+function shortcode_exists( $tag ) {
+	global $shortcode_tags;
+	return array_key_exists( $tag, $shortcode_tags );
+}
+
+/**
  * Search content for shortcodes and filter shortcodes through their hooks.
  *
  * If there are no shortcode tags defined, then the content will be returned
