Create a stereo_mode metadata tag to specify the stereo 3d video layout using the StereoMode tag in a matroska/webm video track.tags/n0.8
| @@ -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); | |||