Make VLC player support polarized 3D.让VLC播放器支持偏振3D效果。

28 篇文章 0 订阅
9 篇文章 0 订阅

This is the initial patch for VLC player's polarized 3D support.

将这个patch应用到VLC播放器的源代码中,会多出一个--anaglyph-scheme polarized的3d模式,全屏幕播放视频时,可以支持偏振3D效果。

# use "./vlc  --anaglyph-scheme polarized" to start vlc then watch SBS 3d in fullscreen
# brought to you by Joyer(collger AT gmail.com)
diff --git a/modules/video_filter/anaglyph.c b/modules/video_filter/anaglyph.c
index 5e103d4..6968cda 100644
--- a/modules/video_filter/anaglyph.c
+++ b/modules/video_filter/anaglyph.c
@@ -24,7 +24,7 @@
 #ifdef HAVE_CONFIG_H
 #   include "config.h"
 #endif
-
+#include <math.h>
 #include <vlc_common.h>
 #include <vlc_plugin.h>
 
@@ -35,6 +35,7 @@ static int Create(vlc_object_t *);
 static void Destroy(vlc_object_t *);
 static picture_t *Filter(filter_t *, picture_t *);
 static void combine_side_by_side_yuv420(picture_t *, picture_t *, int, int);
+static void combine_side_by_side_yuv420_polarized(picture_t *, picture_t *);
 
 #define SCHEME_TEXT N_("Color scheme")
 #define SCHEME_LONGTEXT N_("Define the glasses' color scheme")
@@ -51,6 +52,7 @@ enum scheme_e
     red_cyan,
     trioscopic,
     magenta_cyan,
+    polarized
 };
 
 static const char *const ppsz_scheme_values[] = {
@@ -59,6 +61,7 @@ static const char *const ppsz_scheme_values[] = {
     "red-cyan",
     "trioscopic",
     "magenta-cyan",
+    "polarized"
     };
 static const char *const ppsz_scheme_descriptions[] = {
     "pure red (left)  pure green (right)",
@@ -66,6 +69,7 @@ static const char *const ppsz_scheme_descriptions[] = {
     "pure red (left)  pure cyan (right)",
     "pure green (left)  pure magenta (right)",
     "magenta (left)  cyan (right)",
+    "polarized lcd"
     };
 
 vlc_module_begin()
@@ -85,7 +89,7 @@ static const char *const ppsz_filter_options[] = {
 
 struct filter_sys_t
 {
-    int left, right;
+    int left, right, polarized;
 };
 
 
@@ -116,6 +120,7 @@ static int Create(vlc_object_t *p_this)
 
     char *psz_scheme = var_CreateGetStringCommand(p_filter,
                                                   FILTER_PREFIX "scheme");
+	p_sys->polarized = 0;
     enum scheme_e scheme = red_cyan;
     if (psz_scheme)
     {
@@ -129,6 +134,8 @@ static int Create(vlc_object_t *p_this)
             scheme = trioscopic;
         else if (!strcmp(psz_scheme, "magenta-cyan"))
             scheme = magenta_cyan;
+        else if (!strcmp(psz_scheme, "polarized"))
+            scheme = polarized;
         else
             msg_Err(p_filter, "Unknown anaglyph color scheme '%s'", psz_scheme);
     }
@@ -156,6 +163,9 @@ static int Create(vlc_object_t *p_this)
             p_sys->left = 0xff00ff;
             p_sys->right = 0x00ffff;
             break;
+	    case polarized:
+			p_sys->polarized = 1;
+			break;
         case unknown:
             msg_Err(p_filter, "Oops");
             break;
@@ -191,8 +201,12 @@ static picture_t *Filter(filter_t *p_filter, picture_t *p_pic)
         case VLC_CODEC_I420:
         case VLC_CODEC_J420:
         case VLC_CODEC_YV12:
-            combine_side_by_side_yuv420(p_pic, p_outpic,
-                                        p_sys->left, p_sys->right);
+			if (p_sys->polarized) {
+				combine_side_by_side_yuv420_polarized(p_pic, p_outpic);
+			} else {
+				combine_side_by_side_yuv420(p_pic, p_outpic,
+											p_sys->left, p_sys->right);
+			}
             break;
 
         default:
@@ -205,6 +219,68 @@ static picture_t *Filter(filter_t *p_filter, picture_t *p_pic)
     return CopyInfoAndRelease(p_outpic, p_pic);
 }
 
+static int blend(int c1, int c2) {
+	return (int)sqrt((c1*c1 + c2*c2)/2);
+}
+
+static void combine_side_by_side_yuv420_polarized(picture_t *p_inpic,
+												  picture_t *p_outpic)
+{
+    uint8_t *y1inl = p_inpic->p[Y_PLANE].p_pixels; /*input line left*/
+    uint8_t *uinl = p_inpic->p[U_PLANE].p_pixels;
+    uint8_t *vinl = p_inpic->p[V_PLANE].p_pixels;
+
+    uint8_t *y1out = p_outpic->p[Y_PLANE].p_pixels;
+    uint8_t *uout = p_outpic->p[U_PLANE].p_pixels;
+    uint8_t *vout = p_outpic->p[V_PLANE].p_pixels;
+
+    const int in_pitch = p_inpic->p[Y_PLANE].i_pitch;
+    const int out_pitch = p_outpic->p[Y_PLANE].i_pitch;
+
+    const int visible_pitch = p_inpic->p[Y_PLANE].i_visible_pitch;
+    const int visible_lines = p_inpic->p[Y_PLANE].i_visible_lines;
+    /*const int uv_visible_pitch = p_inpic->p[U_PLANE].i_visible_pitch;*/
+
+	int cnt,col;
+	int uinc = p_inpic->p[U_PLANE].i_pitch;
+	int vinc = p_inpic->p[V_PLANE].i_pitch;
+	int uoutc = p_outpic->p[U_PLANE].i_pitch;
+	int voutc = p_outpic->p[V_PLANE].i_pitch;
+	for (cnt=0;cnt<visible_lines / 2;cnt++) {
+		for(col=0; col<visible_pitch;col++) {
+			int halfw = visible_pitch / 2;
+			int left_idx = col/2;
+			int right_idx = left_idx + halfw;
+			y1out[col] = blend(y1inl[left_idx], y1inl[left_idx + in_pitch]);
+			y1out[col + out_pitch] = blend(y1inl[right_idx], y1inl[right_idx + in_pitch]);
+		}
+		y1inl += in_pitch * 2;
+		y1out += out_pitch * 2;
+	}
+
+	for (cnt=0;cnt<p_inpic->p[U_PLANE].i_visible_lines / 2;cnt++) {
+		for(col=0; col<uinc;col++) {
+			int halfw = uinc / 2;
+			int left_idx = col/2;
+			int right_idx = left_idx + halfw;
+			uout[col] = blend(uinl[left_idx], uinl[left_idx + uinc]);
+			uout[col + uoutc] = blend(uinl[right_idx], uinl[right_idx + uinc]);
+		}
+
+		for(col=0; col<vinc;col++) {
+			int halfw = vinc / 2;
+			int left_idx = col/2;
+			int right_idx = left_idx + halfw;
+			vout[col] = blend(vinl[left_idx], vinl[left_idx + vinc]);
+			vout[col + voutc] = blend(vinl[right_idx], vinl[right_idx + vinc]);
+		}
+
+		uinl += uinc * 2;
+		vinl += vinc * 2;
+		uout += uinc * 2;
+		vout += vinc * 2;
+	}
+}
 
 static void combine_side_by_side_yuv420(picture_t *p_inpic, picture_t *p_outpic,
                                         int left, int right)


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您提供的信息,我假设您在使用C#语言编写一个应用程序,其中包含一个名为“vlcPlayer”的VLC媒体播放器控件,并且您想要了解其MediaPlayer.MediaOptions属性的内部实现。 在C#中,vlcPlayer.MediaPlayer.MediaOptions属性是一个Vlc.DotNet.Core.Medias.MediaPlayerOptions类型的对象。这个对象包含了VLC播放器的各种选项和参数,可以通过这个对象来对VLC播放器进行配置和控制。 具体来说,MediaPlayerOptions对象包含了一个名为“LibVlcOption”的属性,它是一个Dictionary<string, string>类型的对象,用于存储VLC播放器的各种选项和参数。您可以通过向这个字典中添加或修改键值对来控制VLC播放器的行为,例如: ```csharp vlcPlayer.MediaPlayer.MediaOptions.LibVlcOption.Add("--no-video-title-show", "true"); // 禁止显示视频标题 vlcPlayer.MediaPlayer.MediaOptions.LibVlcOption.Add("--no-audio", "true"); // 禁止播放音频 vlcPlayer.MediaPlayer.MediaOptions.LibVlcOption.Add("--start-time", "10"); // 从视频的第10秒开始播放 ``` 当您设置MediaPlayerOptions属性时,VLC播放器将使用这些选项和参数来配置自身。例如,在播放一个视频文件时,您可以使用以下代码: ```csharp vlcPlayer.MediaPlayer.MediaOptions.LibVlcOption.Add("--no-video-title-show", "true"); vlcPlayer.MediaPlayer.MediaOptions.LibVlcOption.Add("--no-audio", "true"); vlcPlayer.Play(new FileInfo("video.mp4")); ``` 这将禁止VLC播放器显示视频标题和播放音频,并开始播放名为“video.mp4”的视频文件。 需要注意的是,MediaPlayerOptions对象只能在Vlc.DotNet.Core.Medias.MediaPlayer类的实例化过程中进行设置,而不能在播放过程中进行修改。如果您想要在播放过程中修改播放器的选项,您需要首先停止播放器,然后重新设置MediaPlayerOptions属性,最后再开始播放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值