You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	webm: support stereo videos in matroska/webm muxer
Create a stereo_mode metadata tag to specify the stereo 3d video layout using the StereoMode tag in a matroska/webm video track.
This commit is contained in:
		
				
					committed by
					
						 Reinhard Tartler
						Reinhard Tartler
					
				
			
			
				
	
			
			
			
						parent
						
							f91ccb1df6
						
					
				
				
					commit
					945dda41a2
				
			| @@ -204,4 +204,67 @@ Alternatively you can write the command as: | ||||
| ffmpeg -benchmark -i INPUT -f null - | ||||
| @end example | ||||
|  | ||||
| @section matroska | ||||
|  | ||||
| Matroska container muxer. | ||||
|  | ||||
| This muxer implements the matroska and webm container specs. | ||||
|  | ||||
| The recognized metadata settings in this muxer are: | ||||
|  | ||||
| @table @option | ||||
|  | ||||
| @item title=@var{title name} | ||||
| Name provided to a single track | ||||
| @end table | ||||
|  | ||||
| @table @option | ||||
|  | ||||
| @item language=@var{language name} | ||||
| Specifies the language of the track in the Matroska languages form | ||||
| @end table | ||||
|  | ||||
| @table @option | ||||
|  | ||||
| @item STEREO_MODE=@var{mode} | ||||
| Stereo 3D video layout of two views in a single video track | ||||
| @table @option | ||||
| @item mono | ||||
| video is not stereo | ||||
| @item left_right | ||||
| Both views are arranged side by side, Left-eye view is on the left | ||||
| @item bottom_top | ||||
| Both views are arranged in top-bottom orientation, Left-eye view is at bottom | ||||
| @item top_bottom | ||||
| Both views are arranged in top-bottom orientation, Left-eye view is on top | ||||
| @item checkerboard_rl | ||||
| Each view is arranged in a checkerboard interleaved pattern, Left-eye view being first | ||||
| @item checkerboard_lr | ||||
| Each view is arranged in a checkerboard interleaved pattern, Right-eye view being first | ||||
| @item row_interleaved_rl | ||||
| Each view is constituted by a row based interleaving, Right-eye view is first row | ||||
| @item row_interleaved_lr | ||||
| Each view is constituted by a row based interleaving, Left-eye view is first row | ||||
| @item col_interleaved_rl | ||||
| Both views are arranged in a column based interleaving manner, Right-eye view is first column | ||||
| @item col_interleaved_lr | ||||
| Both views are arranged in a column based interleaving manner, Left-eye view is first column | ||||
| @item anaglyph_cyan_red | ||||
| All frames are in anaglyph format viewable through red-cyan filters | ||||
| @item right_left | ||||
| Both views are arranged side by side, Right-eye view is on the left | ||||
| @item anaglyph_green_magenta | ||||
| All frames are in anaglyph format viewable through green-magenta filters | ||||
| @item block_lr | ||||
| Both eyes laced in one Block, Left-eye view is first | ||||
| @item block_rl | ||||
| Both eyes laced in one Block, Right-eye view is first | ||||
| @end table | ||||
| @end table | ||||
|  | ||||
| For example a 3D WebM clip can be created using the following command line: | ||||
| @example | ||||
| ffmpeg -i sample_left_right_clip.mpg -an -vcodec libvpx -metadata STEREO_MODE=left_right -y stereo_clip.webm | ||||
| @end example | ||||
|  | ||||
| @c man end MUXERS | ||||
|   | ||||
| @@ -111,7 +111,7 @@ | ||||
| #define MATROSKA_ID_VIDEOPIXELCROPR 0x54DD | ||||
| #define MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2 | ||||
| #define MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A | ||||
| #define MATROSKA_ID_VIDEOSTEREOMODE 0x53B9 | ||||
| #define MATROSKA_ID_VIDEOSTEREOMODE 0x53B8 | ||||
| #define MATROSKA_ID_VIDEOASPECTRATIO 0x54B3 | ||||
| #define MATROSKA_ID_VIDEOCOLORSPACE 0x2EB524 | ||||
|  | ||||
| @@ -218,6 +218,24 @@ typedef enum { | ||||
|   MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP = 3, | ||||
| } MatroskaTrackEncodingCompAlgo; | ||||
|  | ||||
| typedef enum { | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_MONO               = 0, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT         = 1, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP         = 2, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM         = 3, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL    = 4, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR    = 5, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL = 6, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR = 7, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL = 8, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR = 9, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED  = 10, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT         = 11, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG = 12, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR = 13, | ||||
|   MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL = 14, | ||||
| } MatroskaVideoStereoModeType; | ||||
|  | ||||
| /* | ||||
|  * Matroska Codec IDs, strings | ||||
|  */ | ||||
|   | ||||
| @@ -586,6 +586,25 @@ static int mkv_write_tracks(AVFormatContext *s) | ||||
|                 // XXX: interlace flag? | ||||
|                 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width); | ||||
|                 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height); | ||||
|                 if ((tag = av_metadata_get(s->metadata, "stereo_mode", NULL, 0))) { | ||||
|                     uint8_t stereo_fmt = atoi(tag->value); | ||||
|                     int valid_fmt = 0; | ||||
|  | ||||
|                     switch (mkv->mode) { | ||||
|                     case MODE_WEBM: | ||||
|                         if (stereo_fmt <= MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM | ||||
|                             || stereo_fmt == MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT) | ||||
|                             valid_fmt = 1; | ||||
|                         break; | ||||
|                     case MODE_MATROSKAv2: | ||||
|                         if (stereo_fmt <= MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL) | ||||
|                             valid_fmt = 1; | ||||
|                         break; | ||||
|                     } | ||||
|  | ||||
|                     if (valid_fmt) | ||||
|                         put_ebml_uint (pb, MATROSKA_ID_VIDEOSTEREOMODE, stereo_fmt); | ||||
|                 } | ||||
|                 if (st->sample_aspect_ratio.num) { | ||||
|                     int d_width = codec->width*av_q2d(st->sample_aspect_ratio); | ||||
|                     put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user