aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2015-04-08 16:29:48 +0200
committerRainer Hochecker <fernetmenta@online.de>2015-04-08 16:29:48 +0200
commit73c7fda8602b1ec98f28998f38990df1955d780c (patch)
tree3a4ad2599ca886a849412bde50cff2b0933822ce
parentb10504ca997b7689f8d5ab807996589069c91988 (diff)
parent9aafb17474961ae7d6e1fa78b93a282f0267043d (diff)
Merge pull request #5013 from taxigps/ass_position
use subtitle settings to set ASS/SSA subtitles position
-rw-r--r--project/BuildDependencies/scripts/0_package.list2
-rw-r--r--tools/depends/target/libass/Makefile8
-rw-r--r--xbmc/cores/VideoRenderers/BaseRenderer.cpp7
-rw-r--r--xbmc/cores/VideoRenderers/BaseRenderer.h9
-rw-r--r--xbmc/cores/VideoRenderers/OverlayRenderer.cpp58
-rw-r--r--xbmc/cores/VideoRenderers/RenderManager.cpp4
-rw-r--r--xbmc/cores/VideoRenderers/RenderManager.h2
-rw-r--r--xbmc/cores/dvdplayer/DVDOverlayRenderer.cpp2
-rw-r--r--xbmc/cores/dvdplayer/DVDPlayer.cpp7
-rw-r--r--xbmc/cores/dvdplayer/DVDPlayerVideo.h2
-rw-r--r--xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp11
-rw-r--r--xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.h2
-rw-r--r--xbmc/cores/dvdplayer/DVDSubtitles/DllLibass.h3
-rw-r--r--xbmc/cores/dvdplayer/IDVDPlayer.h2
-rw-r--r--xbmc/cores/omxplayer/OMXPlayerVideo.h2
15 files changed, 86 insertions, 35 deletions
diff --git a/project/BuildDependencies/scripts/0_package.list b/project/BuildDependencies/scripts/0_package.list
index a1de1e25a8..ab64b4c94a 100644
--- a/project/BuildDependencies/scripts/0_package.list
+++ b/project/BuildDependencies/scripts/0_package.list
@@ -16,7 +16,7 @@ freetype-2.4.6-win32-3.7z
giflib-5.0.5p-win32.7z
gnutls-3.2.3-win32.zip
jsonschemabuilder-1.0.0-win32-3.7z
-libass-0.10.2-win32.7z
+libass-0.12.1-win32.7z
libbluray-0.4.0-win32.zip
libcdio-0.83-win32-2.7z
libcec-2.2.0-win32-1.7z
diff --git a/tools/depends/target/libass/Makefile b/tools/depends/target/libass/Makefile
index 8df2cecc1f..5fba256894 100644
--- a/tools/depends/target/libass/Makefile
+++ b/tools/depends/target/libass/Makefile
@@ -3,7 +3,7 @@ DEPS= ../../Makefile.include Makefile
# lib name, version
LIBNAME=libass
-VERSION=0.10.1
+VERSION=0.12.1
SOURCE=$(LIBNAME)-$(VERSION)
ARCHIVE=$(SOURCE).tar.gz
@@ -31,9 +31,9 @@ $(LIBDYLIB): $(PLATFORM)
.installed-$(PLATFORM): $(LIBDYLIB)
$(MAKE) -C $(PLATFORM) install
ifeq ($(OS),android)
- rm -f $(PREFIX)/lib/libass.la $(PREFIX)/lib/libass.so $(PREFIX)/lib/libass.so.4
- mv -f $(PREFIX)/lib/libass.so.4.1.0 $(PREFIX)/lib/libass.so
- $(RPL) -e "libass.so.4" "libass.so\x00\x00" $(PREFIX)/lib/libass.so
+ rm -f $(PREFIX)/lib/libass.la $(PREFIX)/lib/libass.so $(PREFIX)/lib/libass.so.5
+ mv -f $(PREFIX)/lib/libass.so.5.1.0 $(PREFIX)/lib/libass.so
+ $(RPL) -e "libass.so.5" "libass.so\x00\x00" $(PREFIX)/lib/libass.so
-$(READELF) --dynamic $(PREFIX)/lib/libass.so | grep ibrary
endif
touch $@
diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.cpp b/xbmc/cores/VideoRenderers/BaseRenderer.cpp
index 751a61bd02..4345c0fb13 100644
--- a/xbmc/cores/VideoRenderers/BaseRenderer.cpp
+++ b/xbmc/cores/VideoRenderers/BaseRenderer.cpp
@@ -306,10 +306,11 @@ float CBaseRenderer::GetAspectRatio() const
return m_sourceFrameRatio * width / height * m_sourceHeight / m_sourceWidth;
}
-void CBaseRenderer::GetVideoRect(CRect &source, CRect &dest)
+void CBaseRenderer::GetVideoRect(CRect &source, CRect &dest, CRect &view)
{
source = m_sourceRect;
dest = m_destRect;
+ view = m_viewRect;
}
inline void CBaseRenderer::ReorderDrawPoints()
@@ -567,7 +568,7 @@ void CBaseRenderer::CalculateFrameAspectRatio(unsigned int desired_width, unsign
void CBaseRenderer::ManageDisplay()
{
- const CRect view = g_graphicsContext.GetViewWindow();
+ m_viewRect = g_graphicsContext.GetViewWindow();
m_sourceRect.x1 = 0.0f;
m_sourceRect.y1 = 0.0f;
@@ -614,7 +615,7 @@ void CBaseRenderer::ManageDisplay()
break;
}
- CalcNormalDisplayRect(view.x1, view.y1, view.Width(), view.Height(), GetAspectRatio() * CDisplaySettings::Get().GetPixelRatio(), CDisplaySettings::Get().GetZoomAmount(), CDisplaySettings::Get().GetVerticalShift());
+ CalcNormalDisplayRect(m_viewRect.x1, m_viewRect.y1, m_viewRect.Width(), m_viewRect.Height(), GetAspectRatio() * CDisplaySettings::Get().GetPixelRatio(), CDisplaySettings::Get().GetZoomAmount(), CDisplaySettings::Get().GetVerticalShift());
}
void CBaseRenderer::SetViewMode(int viewMode)
diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h
index 8988e352d2..389695ac30 100644
--- a/xbmc/cores/VideoRenderers/BaseRenderer.h
+++ b/xbmc/cores/VideoRenderers/BaseRenderer.h
@@ -80,7 +80,13 @@ public:
void SetViewMode(int viewMode);
RESOLUTION GetResolution() const;
- void GetVideoRect(CRect &source, CRect &dest);
+
+ /*! \brief Get video rectangle and view window
+ \param source is original size of the video
+ \param dest is the target rendering area honoring aspect ratio of source
+ \param view is the entire target rendering area for the video (including black bars)
+ */
+ void GetVideoRect(CRect &source, CRect &dest, CRect &view);
float GetAspectRatio() const;
virtual bool AddVideoPicture(DVDVideoPicture* picture, int index) { return false; }
@@ -139,6 +145,7 @@ protected:
CRect m_destRect;
CRect m_oldDestRect; // destrect of the previous frame
CRect m_sourceRect;
+ CRect m_viewRect;
// rendering flags
unsigned m_iFlags;
diff --git a/xbmc/cores/VideoRenderers/OverlayRenderer.cpp b/xbmc/cores/VideoRenderers/OverlayRenderer.cpp
index e8c4bec535..866992ffa8 100644
--- a/xbmc/cores/VideoRenderers/OverlayRenderer.cpp
+++ b/xbmc/cores/VideoRenderers/OverlayRenderer.cpp
@@ -220,8 +220,7 @@ void CRenderer::Render(COverlay* o, float adjust_height)
{
CRect rs, rd, rv;
RESOLUTION_INFO res;
- g_renderManager.GetVideoRect(rs, rd);
- rv = g_graphicsContext.GetViewWindow();
+ g_renderManager.GetVideoRect(rs, rd, rv);
res = g_graphicsContext.GetResInfo(g_renderManager.GetResolution());
SRenderState state;
@@ -326,14 +325,40 @@ bool CRenderer::HasOverlay(int idx)
COverlay* CRenderer::Convert(CDVDOverlaySSA* o, double pts)
{
- CRect src, dst;
- g_renderManager.GetVideoRect(src, dst);
-
- int width = MathUtils::round_int(dst.Width());
- int height = MathUtils::round_int(dst.Height());
-
+ // libass render in a target area which named as frame. the frame size may bigger than video size,
+ // and including margins between video to frame edge. libass allow to render subtitles into the margins.
+ // this has been used to show subtitles in the top or bottom "black bar" between video to frame border.
+ CRect src, dst, target;
+ g_renderManager.GetVideoRect(src, dst, target);
+ int videoWidth = MathUtils::round_int(dst.Width());
+ int videoHeight = MathUtils::round_int(dst.Height());
+ int targetWidth = MathUtils::round_int(target.Width());
+ int targetHeight = MathUtils::round_int(target.Height());
+ int useMargin;
+
+ int subalign = CSettings::Get().GetInt("subtitles.align");
+ if(subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE
+ || subalign == SUBTITLE_ALIGN_TOP_OUTSIDE
+ || subalign == SUBTITLE_ALIGN_MANUAL)
+ useMargin = 1;
+ else
+ useMargin = 0;
+ double position;
+ // position used to call ass_set_line_position, it's vertical line position of subtitles in percent.
+ // value is 0-100: 0 = on the bottom (default), 100 = on top.
+ if(subalign == SUBTITLE_ALIGN_TOP_INSIDE
+ || subalign == SUBTITLE_ALIGN_TOP_OUTSIDE)
+ position = 100.0;
+ else if (subalign == SUBTITLE_ALIGN_MANUAL)
+ {
+ RESOLUTION_INFO res;
+ res = g_graphicsContext.GetResInfo(g_renderManager.GetResolution());
+ position = 100.0 - (res.iSubtitles - res.Overscan.top) * 100 / res.iHeight;
+ }
+ else
+ position = 0.0;
int changes = 0;
- ASS_Image* images = o->m_libass->RenderImage(width, height, pts, &changes);
+ ASS_Image* images = o->m_libass->RenderImage(targetWidth, targetHeight, videoWidth, videoHeight, pts, useMargin, position, &changes);
if(o->m_overlay)
{
@@ -341,12 +366,21 @@ COverlay* CRenderer::Convert(CDVDOverlaySSA* o, double pts)
return o->m_overlay->Acquire();
}
+ COverlay *overlay = NULL;
#if defined(HAS_GL) || defined(HAS_GLES)
- return new COverlayGlyphGL(images, width, height);
+ overlay = new COverlayGlyphGL(images, targetWidth, targetHeight);
#elif defined(HAS_DX)
- return new COverlayQuadsDX(images, width, height);
+ overlay = new COverlayQuadsDX(images, targetWidth, targetHeight);
#endif
- return NULL;
+ // scale to video dimensions
+ if (overlay)
+ {
+ overlay->m_width = (float)targetWidth / videoWidth;
+ overlay->m_height = (float)targetHeight / videoHeight;
+ overlay->m_x = ((float)videoWidth - targetWidth) / 2 / videoWidth;
+ overlay->m_y = ((float)videoHeight - targetHeight) / 2 / videoHeight;
+ }
+ return overlay;
}
diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
index cfef46ccf9..25323ef43c 100644
--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
@@ -129,11 +129,11 @@ CXBMCRenderManager::~CXBMCRenderManager()
m_pRenderer = NULL;
}
-void CXBMCRenderManager::GetVideoRect(CRect &source, CRect &dest)
+void CXBMCRenderManager::GetVideoRect(CRect &source, CRect &dest, CRect &view)
{
CSharedLock lock(m_sharedSection);
if (m_pRenderer)
- m_pRenderer->GetVideoRect(source, dest);
+ m_pRenderer->GetVideoRect(source, dest, view);
}
float CXBMCRenderManager::GetAspectRatio()
diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h
index b5ceb799ba..f32f4a9fd4 100644
--- a/xbmc/cores/VideoRenderers/RenderManager.h
+++ b/xbmc/cores/VideoRenderers/RenderManager.h
@@ -54,7 +54,7 @@ public:
~CXBMCRenderManager();
// Functions called from the GUI
- void GetVideoRect(CRect &source, CRect &dest);
+ void GetVideoRect(CRect &source, CRect &dest, CRect &view);
float GetAspectRatio();
void Update();
void FrameMove();
diff --git a/xbmc/cores/dvdplayer/DVDOverlayRenderer.cpp b/xbmc/cores/dvdplayer/DVDOverlayRenderer.cpp
index 34506c9f6e..0a20cc273f 100644
--- a/xbmc/cores/dvdplayer/DVDOverlayRenderer.cpp
+++ b/xbmc/cores/dvdplayer/DVDOverlayRenderer.cpp
@@ -71,7 +71,7 @@ void CDVDOverlayRenderer::Render(DVDPictureRenderer* pPicture, CDVDOverlaySSA* p
height = pPicture->height;
width = pPicture->width;
- ASS_Image* img = pOverlay->m_libass->RenderImage(width, height, pts);
+ ASS_Image* img = pOverlay->m_libass->RenderImage(width, height, width, height, pts);
int depth = OVERLAY::GetStereoscopicDepth();
diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp
index 82b59d2080..ab7816c26b 100644
--- a/xbmc/cores/dvdplayer/DVDPlayer.cpp
+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp
@@ -3924,8 +3924,8 @@ bool CDVDPlayer::OnAction(const CAction &action)
case ACTION_MOUSE_MOVE:
case ACTION_MOUSE_LEFT_CLICK:
{
- CRect rs, rd;
- m_dvdPlayerVideo->GetVideoRect(rs, rd);
+ CRect rs, rd, rv;
+ m_dvdPlayerVideo->GetVideoRect(rs, rd, rv);
CPoint pt(action.GetAmount(), action.GetAmount(1));
if (!rd.PtInRect(pt))
return false; // out of bounds
@@ -4162,7 +4162,8 @@ void CDVDPlayer::GetVideoStreamInfo(SPlayerVideoStreamInfo &info)
}
info.videoCodecName = retVal;
info.videoAspectRatio = m_dvdPlayerVideo->GetAspectRatio();
- m_dvdPlayerVideo->GetVideoRect(info.SrcRect, info.DestRect);
+ CRect viewRect;
+ m_dvdPlayerVideo->GetVideoRect(info.SrcRect, info.DestRect, viewRect);
info.stereoMode = m_dvdPlayerVideo->GetStereoMode();
if (info.stereoMode == "mono")
info.stereoMode = "";
diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h
index ead6f70798..3dfba89a46 100644
--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h
+++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h
@@ -84,7 +84,7 @@ public:
void EnableFullscreen(bool bEnable) { m_bAllowFullscreen = bEnable; }
#ifdef HAS_VIDEO_PLAYBACK
- void GetVideoRect(CRect& SrcRect, CRect& DestRect) const { g_renderManager.GetVideoRect(SrcRect, DestRect); }
+ void GetVideoRect(CRect& SrcRect, CRect& DestRect, CRect& ViewRect) const { g_renderManager.GetVideoRect(SrcRect, DestRect, ViewRect); }
float GetAspectRatio() { return g_renderManager.GetAspectRatio(); }
#endif
diff --git a/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp b/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp
index 6890c264df..0b5b050bbd 100644
--- a/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp
+++ b/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.cpp
@@ -154,7 +154,7 @@ bool CDVDSubtitlesLibass::CreateTrack(char* buf, size_t size)
return true;
}
-ASS_Image* CDVDSubtitlesLibass::RenderImage(int imageWidth, int imageHeight, double pts, int *changes)
+ASS_Image* CDVDSubtitlesLibass::RenderImage(int frameWidth, int frameHeight, int videoWidth, int videoHeight, double pts, int useMargin, double position, int *changes)
{
CSingleLock lock(m_section);
if(!m_renderer || !m_track)
@@ -163,8 +163,13 @@ ASS_Image* CDVDSubtitlesLibass::RenderImage(int imageWidth, int imageHeight, dou
return NULL;
}
- double storage_aspact = (double)imageWidth / imageHeight;
- m_dll.ass_set_frame_size(m_renderer, imageWidth, imageHeight);
+ double storage_aspact = (double)frameWidth / frameHeight;
+ m_dll.ass_set_frame_size(m_renderer, frameWidth, frameHeight);
+ int topmargin = (frameHeight - videoHeight) / 2;
+ int leftmargin = (frameWidth - videoWidth) / 2;
+ m_dll.ass_set_margins(m_renderer, topmargin, topmargin, leftmargin, leftmargin);
+ m_dll.ass_set_use_margins(m_renderer, useMargin);
+ m_dll.ass_set_line_position(m_renderer, position);
m_dll.ass_set_aspect_ratio(m_renderer, storage_aspact / g_graphicsContext.GetResInfo().fPixelRatio, storage_aspact);
return m_dll.ass_render_frame(m_renderer, m_track, DVD_TIME_TO_MSEC(pts), changes);
}
diff --git a/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.h b/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.h
index ee30436184..b9129928ad 100644
--- a/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.h
+++ b/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitlesLibass.h
@@ -32,7 +32,7 @@ public:
CDVDSubtitlesLibass();
virtual ~CDVDSubtitlesLibass();
- ASS_Image* RenderImage(int imageWidth, int imageHeight, double pts, int* changes = NULL);
+ ASS_Image* RenderImage(int frameWidth, int frameHeight, int videoWidth, int videoHeight, double pts, int useMargin = 0, double position = 0.0, int* changes = NULL);
ASS_Event* GetEvents();
int GetNrOfEvents();
diff --git a/xbmc/cores/dvdplayer/DVDSubtitles/DllLibass.h b/xbmc/cores/dvdplayer/DVDSubtitles/DllLibass.h
index 6e30ea4cbe..78716e61b5 100644
--- a/xbmc/cores/dvdplayer/DVDSubtitles/DllLibass.h
+++ b/xbmc/cores/dvdplayer/DVDSubtitles/DllLibass.h
@@ -49,6 +49,7 @@ public:
virtual void ass_set_aspect_ratio(ASS_Renderer* priv, double dar, double sar)=0;
virtual void ass_set_margins(ASS_Renderer* priv, int t, int b, int l, int r)=0;
virtual void ass_set_use_margins(ASS_Renderer* priv, int use)=0;
+ virtual void ass_set_line_position(ASS_Renderer* priv, double line_position)=0;
virtual void ass_set_font_scale(ASS_Renderer* priv, double font_scale)=0;
virtual ASS_Image* ass_render_frame(ASS_Renderer *priv, ASS_Track* track, long long now, int* detect_change)=0;
virtual ASS_Track* ass_new_track(ASS_Library*)=0;
@@ -77,6 +78,7 @@ class DllLibass : public DllDynamic, DllLibassInterface
DEFINE_METHOD3(void, ass_set_aspect_ratio, (ASS_Renderer * p1, double p2, double p3))
DEFINE_METHOD5(void, ass_set_margins, (ASS_Renderer * p1, int p2, int p3, int p4, int p5))
DEFINE_METHOD2(void, ass_set_use_margins, (ASS_Renderer * p1, int p2))
+ DEFINE_METHOD2(void, ass_set_line_position, (ASS_Renderer * p1, double p2))
DEFINE_METHOD2(void, ass_set_font_scale, (ASS_Renderer * p1, double p2))
DEFINE_METHOD4(ASS_Image *, ass_render_frame, (ASS_Renderer * p1, ASS_Track * p2, long long p3, int * p4))
DEFINE_METHOD1(ASS_Track *, ass_new_track, (ASS_Library * p1))
@@ -99,6 +101,7 @@ class DllLibass : public DllDynamic, DllLibassInterface
RESOLVE_METHOD(ass_set_aspect_ratio)
RESOLVE_METHOD(ass_set_margins)
RESOLVE_METHOD(ass_set_use_margins)
+ RESOLVE_METHOD(ass_set_line_position)
RESOLVE_METHOD(ass_set_font_scale)
RESOLVE_METHOD(ass_render_frame)
RESOLVE_METHOD(ass_new_track)
diff --git a/xbmc/cores/dvdplayer/IDVDPlayer.h b/xbmc/cores/dvdplayer/IDVDPlayer.h
index cd8abfdc78..bbf76e06f9 100644
--- a/xbmc/cores/dvdplayer/IDVDPlayer.h
+++ b/xbmc/cores/dvdplayer/IDVDPlayer.h
@@ -69,7 +69,7 @@ public:
virtual bool IsSubtitleEnabled() = 0;
virtual void EnableFullscreen(bool bEnable) = 0;
#ifdef HAS_VIDEO_PLAYBACK
- virtual void GetVideoRect(CRect& SrcRect, CRect& DestRect) const = 0;
+ virtual void GetVideoRect(CRect& SrcRect, CRect& DestRect, CRect& ViewRect) const = 0;
virtual float GetAspectRatio() = 0;
#endif
virtual double GetDelay() = 0;
diff --git a/xbmc/cores/omxplayer/OMXPlayerVideo.h b/xbmc/cores/omxplayer/OMXPlayerVideo.h
index 7908ee57a2..3d0c13e162 100644
--- a/xbmc/cores/omxplayer/OMXPlayerVideo.h
+++ b/xbmc/cores/omxplayer/OMXPlayerVideo.h
@@ -124,7 +124,7 @@ public:
void SetFlags(unsigned flags) { m_flags = flags; };
int GetFreeSpace();
void SetVideoRect(const CRect &SrcRect, const CRect &DestRect);
- void GetVideoRect(CRect& SrcRect, CRect& DestRect) const { g_renderManager.GetVideoRect(SrcRect, DestRect); }
+ void GetVideoRect(CRect& SrcRect, CRect& DestRect, CRect& ViewRect) const { g_renderManager.GetVideoRect(SrcRect, DestRect, ViewRect); }
static void RenderUpdateCallBack(const void *ctx, const CRect &SrcRect, const CRect &DestRect);
void ResolutionUpdateCallBack(uint32_t width, uint32_t height, float framerate, float pixel_aspect);
static void ResolutionUpdateCallBack(void *ctx, uint32_t width, uint32_t height, float framerate, float pixel_aspect);