Revision: 33519
http://xbmc.svn.sourceforge.net/xbmc/?rev=33519&view=rev
Author: blinkseb
Date: 2010-09-04 09:57:36 +0000 (Sat, 04 Sep 2010)
Log Message:
-----------
[DSPlayer] added: support for .sup subtitles, and fixed pgs rendering. Rendering & animation seems ok, but not really tested
Modified Paths:
--------------
branches/dsplayer/xbmc/Util.cpp
branches/dsplayer/xbmc/cores/DSPlayer/DSPlayer.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/dsutil/DSUtil.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/dsutil/DSUtil.h
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/libsubs/SubManager.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subpic/ISubPic.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subpic/ISubPic.h
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/BaseSub.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/BaseSub.h
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/CompositionObject.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/CompositionObject.h
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/DVBSub.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/HdmvSub.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/HdmvSub.h
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/RenderedHdmvSubtitle.cpp
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/RenderedHdmvSubtitle.h
branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/VobSubFile.h
Modified: branches/dsplayer/xbmc/Util.cpp
===================================================================
--- branches/dsplayer/xbmc/Util.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/Util.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -1403,7 +1403,7 @@
}
}
-static const char * sub_exts[] = { ".utf", ".utf8", ".utf-8", ".sub", ".srt", ".smi", ".rt", ".txt", ".ssa", ".aqt", ".jss", ".ass", ".idx", NULL};
+static const char * sub_exts[] = { ".utf", ".utf8", ".utf-8", ".sub", ".srt", ".smi", ".rt", ".txt", ".ssa", ".aqt", ".jss", ".ass", ".idx", ".sup", NULL};
void CUtil::CacheSubtitles(const CStdString& strMovie, CStdString& strExtensionCached, XFILE::IFileCallback *pCallback )
{
@@ -1534,7 +1534,7 @@
{
CFileItemList items;
- CDirectory::GetDirectory(strLookInPaths[step], items,".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.text|.ssa|.aqt|.jss|.ass|.idx|.ifo|.rar|.zip",false);
+ CDirectory::GetDirectory(strLookInPaths[step], items,".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.text|.ssa|.aqt|.jss|.ass|.idx|.ifo|.rar|.zip|.sup",false);
int fnl = strFileNameNoExt.size();
CStdString strFileNameNoExtNoCase(strFileNameNoExt);
@@ -1591,7 +1591,7 @@
// build the vector with extensions
CFileItemList items;
- CDirectory::GetDirectory("special://temp/", items,".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.text|.ssa|.aqt|.jss|.ass|.idx|.ifo|.rar|.zip",false);
+ CDirectory::GetDirectory("special://temp/", items,".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.text|.ssa|.aqt|.jss|.ass|.idx|.ifo|.rar|.zip|.sup",false);
for (int i=0;i<items.Size();++i)
{
if (items[i]->m_bIsFolder)
Modified: branches/dsplayer/xbmc/cores/DSPlayer/DSPlayer.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/DSPlayer.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/DSPlayer.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -231,7 +231,7 @@
void CDSPlayer::HandleStart()
{
if (m_PlayerOptions.starttime > 0)
- CDSGraph::PostMessage( new CDSMsgPlayerSeekTime(SEC_TO_DS_TIME(m_PlayerOptions.starttime, 1U, false)) , false );
+ CDSGraph::PostMessage( new CDSMsgPlayerSeekTime(SEC_TO_DS_TIME(m_PlayerOptions.starttime), 1U, false) , false );
else
CDSGraph::PostMessage( new CDSMsgPlayerSeekTime(0, 1U, false) , false );
}
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/dsutil/DSUtil.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/dsutil/DSUtil.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/dsutil/DSUtil.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -117,20 +117,6 @@
return str;
}
-CStdString ReftimeToString(const REFERENCE_TIME& rtVal)
-{
- CStdString strTemp;
-
- LONGLONG llTotalMs = (rtVal / 10000000 / 1000);
- int lHour = (int)(llTotalMs / (1000*60*60));
- int lMinute = (llTotalMs / (1000*60)) % 60;
- int lSecond = (llTotalMs / 1000) % 60;
- int lMillisec = llTotalMs % 1000;
-
- strTemp.Format (_T("%02d:%02d:%02d,%03d"), lHour, lMinute, lSecond, lMillisec);
- return strTemp;
-}
-
static struct {LPCSTR name, iso6392, iso6391; LCID lcid;} s_isolangs[] = // TODO : fill LCID !!!
{
{"Abkhazian", "abk", "ab"},
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/dsutil/DSUtil.h
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/dsutil/DSUtil.h 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/dsutil/DSUtil.h 2010-09-04 09:57:36 UTC (rev 33519)
@@ -41,7 +41,6 @@
extern CStdString ISO6392ToLanguage(LPCSTR code);
extern LCID ISO6391ToLcid(LPCSTR code);
extern LCID ISO6392ToLcid(LPCSTR code);
-extern CStdString ReftimeToString(const REFERENCE_TIME& rtVal);
extern COLORREF YCrCbToRGB_Rec601(BYTE Y, BYTE Cr, BYTE Cb);
extern COLORREF YCrCbToRGB_Rec709(BYTE Y, BYTE Cr, BYTE Cb);
extern DWORD YCrCbToRGB_Rec601(BYTE A, BYTE Y, BYTE Cr, BYTE Cb);
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/libsubs/SubManager.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/libsubs/SubManager.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/libsubs/SubManager.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -6,6 +6,7 @@
#include <moreuuids.h>
#include "..\subtitles\VobSubFile.h"
#include "..\subtitles\RTS.h"
+#include "..\subtitles\RenderedHdmvSubtitle.h"
#include "..\DSUtil\NullRenderers.h"
#include "TextPassThruFilter.h"
#include "..\ILog.h"
@@ -317,6 +318,14 @@
pSubStream = pVSF.release();
}
+ if (!pSubStream)
+ {
+ std::auto_ptr<CRenderedHdmvSubtitleFile> pPGS(new CRenderedHdmvSubtitleFile(&m_csSubLock, ST_HDMV));
+ if ((CStdString(GetExtension(path).MakeLower()) == _T("pgs") || CStdString(GetExtension(path).MakeLower()) == _T("sup"))
+ && pPGS.get() && pPGS->Open(path))
+ pSubStream = pPGS.release();
+ }
+
if(!pSubStream)
{
std::auto_ptr<CRenderedTextSubtitle> pRTS(new CRenderedTextSubtitle(&m_csSubLock));
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subpic/ISubPic.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subpic/ISubPic.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subpic/ISubPic.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -31,7 +31,6 @@
// Debug output
#define DSubPicTraceLevel 0
-#define TRACE odprintf
void __cdecl odprintf(const wchar_t *format, ...)
{
wchar_t buf[4096], *p = buf;
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subpic/ISubPic.h
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subpic/ISubPic.h 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subpic/ISubPic.h 2010-09-04 09:57:36 UTC (rev 33519)
@@ -43,6 +43,9 @@
// ISubPic
//
+#define TRACE odprintf
+extern void __cdecl odprintf(const wchar_t *format, ...);
+
interface __declspec(uuid("449E11F3-52D1-4a27-AA61-E2733AC92CC0"))
ISubPic : public IUnknown
{
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/BaseSub.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/BaseSub.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/BaseSub.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -23,6 +23,20 @@
#include "stdafx.h"
#include "BaseSub.h"
+CStdStringW ReftimeToString(const REFERENCE_TIME& rtVal)
+{
+ CStdStringW strTemp;
+
+ LONGLONG llTotalMs = (rtVal / 10000);
+ int lHour = (int)(llTotalMs / (1000*60*60));
+ int lMinute = (llTotalMs / (1000*60)) % 60;
+ int lSecond = (llTotalMs / 1000) % 60;
+ int lMillisec = llTotalMs % 1000;
+
+ strTemp.Format (_T("%02d:%02d:%02d,%03d"), lHour, lMinute, lSecond, lMillisec);
+ return strTemp;
+}
+
CBaseSub::CBaseSub(SUBTITLE_TYPE nType)
: m_nType(nType)
{
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/BaseSub.h
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/BaseSub.h 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/BaseSub.h 2010-09-04 09:57:36 UTC (rev 33519)
@@ -31,6 +31,8 @@
ST_HDMV
};
+CStdStringW ReftimeToString(const REFERENCE_TIME& rtVal);
+
class CBaseSub
{
public:
@@ -41,6 +43,7 @@
virtual ~CBaseSub();
virtual HRESULT ParseSample (IMediaSample* pSample) = NULL;
+ virtual HRESULT ParseData( REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, BYTE* pData, long size ) { return E_NOTIMPL; }
virtual void Reset() = NULL;
virtual int GetStartPosition(REFERENCE_TIME rt, double fps) = NULL;
virtual int GetNext(int pos) = NULL;
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/CompositionObject.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/CompositionObject.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/CompositionObject.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -24,377 +24,409 @@
#include "CompositionObject.h"
#include "../DSUtil/GolombBuffer.h"
-
-
CompositionObject::CompositionObject()
{
- m_rtStart = 0;
- m_rtStop = 0;
- m_pRLEData = NULL;
- m_nRLEDataSize = 0;
- m_nRLEPos = 0;
- m_nColorNumber = 0;
- memsetd (m_Colors, 0xFF000000, sizeof(m_Colors));
+ m_rtStart = 0;
+ m_rtStop = 0;
+ m_pRLEData = NULL;
+ m_nRLEDataSize = 0;
+ m_nRLEPos = 0;
+ m_nColorNumber = 0;
+ memsetd (m_Colors, 0xFF000000, sizeof(m_Colors));
}
CompositionObject::~CompositionObject()
{
- delete[] m_pRLEData;
+ delete[] m_pRLEData;
}
void CompositionObject::SetPalette (int nNbEntry, HDMV_PALETTE* pPalette, bool bIsHD)
{
- m_nColorNumber = nNbEntry;
+ m_nColorNumber = nNbEntry;
- for (int i=0; i<m_nColorNumber; i++)
- {
-// if (pPalette[i].T != 0) // Prevent ugly background when Alpha=0 (but RGB different from 0)
- {
- if (bIsHD)
- m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec709 (pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb);
- else
- m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec601 (pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb);
- }
-// TRACE_HDMVSUB ("%03d : %08x\n", pPalette[i].entry_id, m_Colors[pPalette[i].entry_id]);
- }
+ for (int i=0; i<m_nColorNumber; i++)
+ {
+// if (pPalette[i].T != 0) // Prevent ugly background when Alpha=0 (but RGB different from 0)
+ {
+ if (bIsHD)
+ m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec709 (pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb);
+ else
+ m_Colors[pPalette[i].entry_id] = YCrCbToRGB_Rec601 (pPalette[i].T, pPalette[i].Y, pPalette[i].Cr, pPalette[i].Cb);
+ }
+// TRACE_HDMVSUB ("%03d : %08x\n", pPalette[i].entry_id, m_Colors[pPalette[i].entry_id]);
+ }
}
void CompositionObject::SetRLEData(BYTE* pBuffer, int nSize, int nTotalSize)
{
- delete[] m_pRLEData;
- m_pRLEData = DNew BYTE[nTotalSize];
- m_nRLEDataSize = nTotalSize;
- m_nRLEPos = nSize;
+ delete[] m_pRLEData;
+ m_pRLEData = DNew BYTE[nTotalSize];
+ m_nRLEDataSize = nTotalSize;
+ m_nRLEPos = nSize;
- memcpy (m_pRLEData, pBuffer, nSize);
+ memcpy (m_pRLEData, pBuffer, nSize);
}
void CompositionObject::AppendRLEData(BYTE* pBuffer, int nSize)
{
- ASSERT (m_nRLEPos+nSize <= m_nRLEDataSize);
- if (m_nRLEPos+nSize <= m_nRLEDataSize)
- {
- memcpy (m_pRLEData+m_nRLEPos, pBuffer, nSize);
- m_nRLEPos += nSize;
- }
+ ASSERT (m_nRLEPos+nSize <= m_nRLEDataSize);
+ if (m_nRLEPos+nSize <= m_nRLEDataSize)
+ {
+ memcpy (m_pRLEData+m_nRLEPos, pBuffer, nSize);
+ m_nRLEPos += nSize;
+ }
}
void CompositionObject::RenderHdmv(SubPicDesc& spd)
{
- if (m_pRLEData)
- {
- CGolombBuffer GBuffer (m_pRLEData, m_nRLEDataSize);
- BYTE bTemp;
- BYTE bSwitch;
+ if (m_pRLEData)
+ {
+ CGolombBuffer GBuffer(m_pRLEData, m_nRLEDataSize);
+ BYTE bTemp;
+ BYTE bSwitch;
- BYTE nPaletteIndex = 0;
- SHORT nCount;
- SHORT nX = 0;
- SHORT nY = 0;
+ BYTE nPaletteIndex = 0;
+ SHORT nCount;
+ SHORT nX = 0;
+ SHORT nY = 0;
- while ((nY < m_height) && !GBuffer.IsEOF())
- {
- bTemp = GBuffer.ReadByte();
- if (bTemp != 0)
- {
- nPaletteIndex = bTemp;
- nCount = 1;
- }
- else
- {
- bSwitch = GBuffer.ReadByte();
- if (!(bSwitch & 0x80))
- {
- if (!(bSwitch & 0x40))
- {
- nCount = bSwitch & 0x3F;
- if (nCount > 0)
- nPaletteIndex = 0;
- }
- else
- {
- nCount = (bSwitch&0x3F) <<8 | (SHORT)GBuffer.ReadByte();
- nPaletteIndex = 0;
- }
- }
- else
- {
- if (!(bSwitch & 0x40))
- {
- nCount = bSwitch & 0x3F;
- nPaletteIndex = GBuffer.ReadByte();
- }
- else
- {
- nCount = (bSwitch&0x3F) <<8 | (SHORT)GBuffer.ReadByte();
- nPaletteIndex = GBuffer.ReadByte();
- }
- }
- }
+ while ((nY < m_height) && !GBuffer.IsEOF())
+ {
+ bTemp = GBuffer.ReadByte();
+ if (bTemp != 0)
+ {
+ nPaletteIndex = bTemp;
+ nCount = 1;
+ }
+ else
+ {
+ bSwitch = GBuffer.ReadByte();
+ if (!(bSwitch & 0x80))
+ {
+ if (!(bSwitch & 0x40))
+ {
+ nCount = bSwitch & 0x3F;
+ if (nCount > 0)
+ nPaletteIndex = 0;
+ }
+ else
+ {
+ nCount = (bSwitch & 0x3F) << 8 | (SHORT)GBuffer.ReadByte();
+ nPaletteIndex = 0;
+ }
+ }
+ else
+ {
+ if (!(bSwitch & 0x40))
+ {
+ nCount = bSwitch & 0x3F;
+ nPaletteIndex = GBuffer.ReadByte();
+ }
+ else
+ {
+ nCount = (bSwitch & 0x3F) << 8 | (SHORT)GBuffer.ReadByte();
+ nPaletteIndex = GBuffer.ReadByte();
+ }
+ }
+ }
- if (nCount>0)
- {
- if (nPaletteIndex != 0xFF) // Fully transparent (\xA79.14.4.2.2.1.1)
- FillSolidRect (spd, nX, nY, nCount, 1, m_Colors[nPaletteIndex]);
- nX += nCount;
- }
- else
- {
- nY++;
- nX = 0;
- }
- }
- }
+ if (nCount > 0)
+ {
+ if (nPaletteIndex != 0xFF) // Fully transparent (\xA79.14.4.2.2.1.1)
+ FillSolidRect (spd, nX, nY, nCount, 1, m_Colors[nPaletteIndex]);
+ nX += nCount;
+ }
+ else
+ {
+ nY++;
+ nX = 0;
+ }
+ }
+ }
}
void CompositionObject::RenderDvb(SubPicDesc& spd, SHORT nX, SHORT nY)
{
- if (m_pRLEData)
- {
- CGolombBuffer gb (m_pRLEData, m_nRLEDataSize);
- SHORT sTopFieldLength;
- SHORT sBottomFieldLength;
+ if (m_pRLEData)
+ {
+ CGolombBuffer gb (m_pRLEData, m_nRLEDataSize);
+ SHORT sTopFieldLength;
+ SHORT sBottomFieldLength;
- sTopFieldLength = gb.ReadShort();
- sBottomFieldLength = gb.ReadShort();
+ sTopFieldLength = gb.ReadShort();
+ sBottomFieldLength = gb.ReadShort();
- DvbRenderField (spd, gb, nX, nY, sTopFieldLength);
- DvbRenderField (spd, gb, nX, nY+1, sBottomFieldLength);
- }
+ DvbRenderField (spd, gb, nX, nY, sTopFieldLength);
+ DvbRenderField (spd, gb, nX, nY+1, sBottomFieldLength);
+ }
}
void CompositionObject::DvbRenderField(SubPicDesc& spd, CGolombBuffer& gb, SHORT nXStart, SHORT nYStart, SHORT nLength)
{
- //FillSolidRect (spd, 0, 0, 300, 10, 0xFFFF0000); // Red opaque
- //FillSolidRect (spd, 0, 10, 300, 10, 0xCC00FF00); // Green 80%
- //FillSolidRect (spd, 0, 20, 300, 10, 0x100000FF); // Blue 60%
- //return;
- SHORT nX = nXStart;
- SHORT nY = nYStart;
- INT64 nEnd = gb.GetPos()+nLength;
- while (gb.GetPos() < nEnd)
- {
- BYTE bType = gb.ReadByte();
- switch (bType)
- {
- case 0x10 :
- Dvb2PixelsCodeString(spd, gb, nX, nY);
- break;
- case 0x11 :
- Dvb4PixelsCodeString(spd, gb, nX, nY);
- break;
- case 0x12 :
- Dvb8PixelsCodeString(spd, gb, nX, nY);
- break;
- case 0x20 :
- gb.SkipBytes (2);
- break;
- case 0x21 :
- gb.SkipBytes (4);
- break;
- case 0x22 :
- gb.SkipBytes (16);
- break;
- case 0xF0 :
- nX = nXStart;
- nY += 2;
- break;
- default :
- ASSERT(FALSE);
- break;
- }
- }
+ //FillSolidRect (spd, 0, 0, 300, 10, 0xFFFF0000); // Red opaque
+ //FillSolidRect (spd, 0, 10, 300, 10, 0xCC00FF00); // Green 80%
+ //FillSolidRect (spd, 0, 20, 300, 10, 0x100000FF); // Blue 60%
+ //return;
+ SHORT nX = nXStart;
+ SHORT nY = nYStart;
+ INT64 nEnd = gb.GetPos()+nLength;
+ while (gb.GetPos() < nEnd)
+ {
+ BYTE bType = gb.ReadByte();
+ switch (bType)
+ {
+ case 0x10 :
+ Dvb2PixelsCodeString(spd, gb, nX, nY);
+ break;
+ case 0x11 :
+ Dvb4PixelsCodeString(spd, gb, nX, nY);
+ break;
+ case 0x12 :
+ Dvb8PixelsCodeString(spd, gb, nX, nY);
+ break;
+ case 0x20 :
+ gb.SkipBytes (2);
+ break;
+ case 0x21 :
+ gb.SkipBytes (4);
+ break;
+ case 0x22 :
+ gb.SkipBytes (16);
+ break;
+ case 0xF0 :
+ nX = nXStart;
+ nY += 2;
+ break;
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+ }
}
void CompositionObject::Dvb2PixelsCodeString(SubPicDesc& spd, CGolombBuffer& gb, SHORT& nX, SHORT& nY)
{
- BYTE bTemp;
- BYTE nPaletteIndex = 0;
- SHORT nCount;
- bool bQuit = false;
+ BYTE bTemp;
+ BYTE nPaletteIndex = 0;
+ SHORT nCount;
+ bool bQuit = false;
- while (!bQuit && !gb.IsEOF())
- {
- nCount = 0;
- nPaletteIndex = 0;
- bTemp = (BYTE)gb.BitRead(2);
- if (bTemp != 0)
- {
- nPaletteIndex = bTemp;
- nCount = 1;
- }
- else
- {
- if (gb.BitRead(1) == 1) // switch_1
- {
- nCount = 3 + (SHORT)gb.BitRead(3); // run_length_3-9
- nPaletteIndex = (BYTE)gb.BitRead(2);
- }
- else
- {
- if (gb.BitRead(1) == 0) // switch_2
- {
- switch (gb.BitRead(2)) // switch_3
- {
- case 0 :
- bQuit = true;
- break;
- case 1 :
- nCount = 2;
- break;
- case 2 : // if (switch_3 == '10')
- nCount = 12 + (SHORT)gb.BitRead(4); // run_length_12-27
- nPaletteIndex = (BYTE)gb.BitRead(2); // 4-bit_pixel-code
- break;
- case 3 :
- nCount = 29 + gb.ReadByte(); // run_length_29-284
- nPaletteIndex = (BYTE)gb.BitRead(2); // 4-bit_pixel-code
- break;
- }
- }
- else
- nCount = 1;
- }
- }
+ while (!bQuit && !gb.IsEOF())
+ {
+ nCount = 0;
+ nPaletteIndex = 0;
+ bTemp = (BYTE)gb.BitRead(2);
+ if (bTemp != 0)
+ {
+ nPaletteIndex = bTemp;
+ nCount = 1;
+ }
+ else
+ {
+ if (gb.BitRead(1) == 1) // switch_1
+ {
+ nCount = 3 + (SHORT)gb.BitRead(3); // run_length_3-9
+ nPaletteIndex = (BYTE)gb.BitRead(2);
+ }
+ else
+ {
+ if (gb.BitRead(1) == 0) // switch_2
+ {
+ switch (gb.BitRead(2)) // switch_3
+ {
+ case 0 :
+ bQuit = true;
+ break;
+ case 1 :
+ nCount = 2;
+ break;
+ case 2 : // if (switch_3 == '10')
+ nCount = 12 + (SHORT)gb.BitRead(4); // run_length_12-27
+ nPaletteIndex = (BYTE)gb.BitRead(2); // 4-bit_pixel-code
+ break;
+ case 3 :
+ nCount = 29 + gb.ReadByte(); // run_length_29-284
+ nPaletteIndex = (BYTE)gb.BitRead(2); // 4-bit_pixel-code
+ break;
+ }
+ }
+ else
+ nCount = 1;
+ }
+ }
- if (nX+nCount > m_width)
- {
- ASSERT (FALSE);
- break;
- }
+ if (nX+nCount > m_width)
+ {
+ ASSERT (FALSE);
+ break;
+ }
- if (nCount>0)
- {
- FillSolidRect (spd, nX, nY, nCount, 1, m_Colors[nPaletteIndex]);
- nX += nCount;
- }
- }
+ if (nCount>0)
+ {
+ FillSolidRect (spd, nX, nY, nCount, 1, m_Colors[nPaletteIndex]);
+ nX += nCount;
+ }
+ }
- gb.BitByteAlign();
+ gb.BitByteAlign();
}
void CompositionObject::Dvb4PixelsCodeString(SubPicDesc& spd, CGolombBuffer& gb, SHORT& nX, SHORT& nY)
{
- BYTE bTemp;
- BYTE nPaletteIndex = 0;
- SHORT nCount;
- bool bQuit = false;
+ BYTE bTemp;
+ BYTE nPaletteIndex = 0;
+ SHORT nCount;
+ bool bQuit = false;
- while (!bQuit && !gb.IsEOF())
- {
- nCount = 0;
- nPaletteIndex = 0;
- bTemp = (BYTE)gb.BitRead(4);
- if (bTemp != 0)
- {
- nPaletteIndex = bTemp;
- nCount = 1;
- }
- else
- {
- if (gb.BitRead(1) == 0) // switch_1
- {
- nCount = (SHORT)gb.BitRead(3); // run_length_3-9
- if (nCount != 0)
- nCount += 2;
- else
- bQuit = true;
- }
- else
- {
- if (gb.BitRead(1) == 0) // switch_2
- {
- nCount = 4 + (SHORT)gb.BitRead(2); // run_length_4-7
- nPaletteIndex = (BYTE)gb.BitRead(4); // 4-bit_pixel-code
- }
- else
- {
- switch (gb.BitRead(2)) // switch_3
- {
- case 0 :
- nCount = 1;
- break;
- case 1 :
- nCount = 2;
- break;
- case 2 : // if (switch_3 == '10')
- nCount = 9 + (SHORT)gb.BitRead(4); // run_length_9-24
- nPaletteIndex = (BYTE)gb.BitRead(4); // 4-bit_pixel-code
- break;
- case 3 :
- nCount = 25 + gb.ReadByte(); // run_length_25-280
- nPaletteIndex = (BYTE)gb.BitRead(4); // 4-bit_pixel-code
- break;
- }
- }
- }
- }
+ while (!bQuit && !gb.IsEOF())
+ {
+ nCount = 0;
+ nPaletteIndex = 0;
+ bTemp = (BYTE)gb.BitRead(4);
+ if (bTemp != 0)
+ {
+ nPaletteIndex = bTemp;
+ nCount = 1;
+ }
+ else
+ {
+ if (gb.BitRead(1) == 0) // switch_1
+ {
+ nCount = (SHORT)gb.BitRead(3); // run_length_3-9
+ if (nCount != 0)
+ nCount += 2;
+ else
+ bQuit = true;
+ }
+ else
+ {
+ if (gb.BitRead(1) == 0) // switch_2
+ {
+ nCount = 4 + (SHORT)gb.BitRead(2); // run_length_4-7
+ nPaletteIndex = (BYTE)gb.BitRead(4); // 4-bit_pixel-code
+ }
+ else
+ {
+ switch (gb.BitRead(2)) // switch_3
+ {
+ case 0 :
+ nCount = 1;
+ break;
+ case 1 :
+ nCount = 2;
+ break;
+ case 2 : // if (switch_3 == '10')
+ nCount = 9 + (SHORT)gb.BitRead(4); // run_length_9-24
+ nPaletteIndex = (BYTE)gb.BitRead(4); // 4-bit_pixel-code
+ break;
+ case 3 :
+ nCount = 25 + gb.ReadByte(); // run_length_25-280
+ nPaletteIndex = (BYTE)gb.BitRead(4); // 4-bit_pixel-code
+ break;
+ }
+ }
+ }
+ }
- if (nX+nCount > m_width)
- {
- ASSERT (FALSE);
- break;
- }
+ if (nX+nCount > m_width)
+ {
+ ASSERT (FALSE);
+ break;
+ }
- if (nCount>0)
- {
- FillSolidRect (spd, nX, nY, nCount, 1, m_Colors[nPaletteIndex]);
- nX += nCount;
- }
- }
+ if (nCount>0)
+ {
+ FillSolidRect (spd, nX, nY, nCount, 1, m_Colors[nPaletteIndex]);
+ nX += nCount;
+ }
+ }
- gb.BitByteAlign();
+ gb.BitByteAlign();
}
void CompositionObject::Dvb8PixelsCodeString(SubPicDesc& spd, CGolombBuffer& gb, SHORT& nX, SHORT& nY)
{
- BYTE bTemp;
- BYTE nPaletteIndex = 0;
- SHORT nCount;
- bool bQuit = false;
+ BYTE bTemp;
+ BYTE nPaletteIndex = 0;
+ SHORT nCount;
+ bool bQuit = false;
- while (!bQuit && !gb.IsEOF())
- {
- nCount = 0;
- nPaletteIndex = 0;
- bTemp = gb.ReadByte();
- if (bTemp != 0)
- {
- nPaletteIndex = bTemp;
- nCount = 1;
- }
- else
- {
- if (gb.BitRead(1) == 0) // switch_1
- {
- nCount = (SHORT)gb.BitRead(7); // run_length_1-127
- if (nCount == 0)
- bQuit = true;
- }
- else
- {
- nCount = (SHORT)gb.BitRead(7); // run_length_3-127
- nPaletteIndex = gb.ReadByte();
- }
- }
+ while (!bQuit && !gb.IsEOF())
+ {
+ nCount = 0;
+ nPaletteIndex = 0;
+ bTemp = gb.ReadByte();
+ if (bTemp != 0)
+ {
+ nPaletteIndex = bTemp;
+ nCount = 1;
+ }
+ else
+ {
+ if (gb.BitRead(1) == 0) // switch_1
+ {
+ nCount = (SHORT)gb.BitRead(7); // run_length_1-127
+ if (nCount == 0)
+ bQuit = true;
+ }
+ else
+ {
+ nCount = (SHORT)gb.BitRead(7); // run_length_3-127
+ nPaletteIndex = gb.ReadByte();
+ }
+ }
- if (nX+nCount > m_width)
- {
- ASSERT (FALSE);
- break;
- }
+ if (nX+nCount > m_width)
+ {
+ ASSERT (FALSE);
+ break;
+ }
- if (nCount>0)
- {
- FillSolidRect (spd, nX, nY, nCount, 1, m_Colors[nPaletteIndex]);
- nX += nCount;
- }
- }
+ if (nCount>0)
+ {
+ FillSolidRect (spd, nX, nY, nCount, 1, m_Colors[nPaletteIndex]);
+ nX += nCount;
+ }
+ }
- gb.BitByteAlign();
+ gb.BitByteAlign();
}
+
+void CompositionObject::Copy(CompositionObject* pObject, bool copyPalette /*= true*/)
+{
+ if (! pObject)
+ return;
+
+ // Don't copy rtStart or rtStop
+ m_object_id_ref = pObject->m_object_id_ref;
+ m_window_id_ref = pObject->m_window_id_ref;
+ m_object_cropped_flag = pObject->m_object_cropped_flag;
+ m_forced_on_flag = pObject->m_forced_on_flag;
+ m_version_number = m_version_number;
+
+ m_horizontal_position = pObject->m_horizontal_position;
+ m_vertical_position = pObject->m_vertical_position;
+ m_width = pObject->m_width;
+ m_height = pObject->m_height;
+
+ m_cropping_horizontal_position = pObject->m_cropping_horizontal_position;
+ m_cropping_vertical_position = pObject->m_cropping_horizontal_position;
+ m_cropping_width = pObject->m_cropping_width;
+ m_cropping_height = pObject->m_cropping_height;
+
+ m_nRLEDataSize = pObject->m_nRLEDataSize;
+ m_nRLEPos = pObject->m_nRLEPos;
+ m_nColorNumber = pObject->m_nColorNumber;
+
+ delete[] m_pRLEData;
+ m_pRLEData = new BYTE[m_nRLEDataSize];
+ memcpy(m_pRLEData, pObject->m_pRLEData, m_nRLEDataSize);
+
+ if (copyPalette)
+ memcpy(m_Colors, pObject->m_Colors, sizeof(DWORD) * 256);
+}
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/CompositionObject.h
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/CompositionObject.h 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/CompositionObject.h 2010-09-04 09:57:36 UTC (rev 33519)
@@ -41,10 +41,10 @@
{
public :
SHORT m_object_id_ref;
- BYTE m_window_id_ref;
- bool m_object_cropped_flag;
- bool m_forced_on_flag;
- BYTE m_version_number;
+ BYTE m_window_id_ref;
+ bool m_object_cropped_flag;
+ bool m_forced_on_flag;
+ BYTE m_version_number;
SHORT m_horizontal_position;
SHORT m_vertical_position;
@@ -72,6 +72,7 @@
void SetPalette (int nNbEntry, HDMV_PALETTE* pPalette, bool bIsHD);
void SetPalette (int nNbEntry, DWORD* dwColors);
bool HavePalette() { return m_nColorNumber>0; };
+ void Copy(CompositionObject* pObject, bool copyPalette = true);
private :
BYTE* m_pRLEData;
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/DVBSub.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/DVBSub.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/DVBSub.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -25,8 +25,6 @@
#include "DVBSub.h"
#include "../DSUtil/GolombBuffer.h"
-#define TRACE
-
#if (1) // Set to 1 to activate DVB subtitles traces
#define TRACE_DVB TRACE
#else
@@ -122,7 +120,7 @@
if (m_nBufferWritePos+nSize > 20*BUFFER_CHUNK_GROW)
{
// Too big to be a DVB sub !
- TRACE_DVB ("DVB - Too much data receive...\n");
+ TRACE_DVB (L"DVB - Too much data receive...\n");
ASSERT (FALSE);
Reset();
@@ -256,24 +254,24 @@
{
m_pCurrentPage = pPage;
m_pCurrentPage->rtStart = m_rtStart;
- TRACE_DVB ("DVB - Page started %S\n", ReftimeToString(m_rtStart));
+ TRACE_DVB (L"DVB - Page started %s\n", ReftimeToString(m_rtStart).c_str());
m_rtStart = INVALID_TIME;
}
else
- TRACE_DVB ("DVB - Page update\n");
+ TRACE_DVB (L"DVB - Page update\n");
}
break;
case REGION :
ParseRegion(gb, wSegLength);
- TRACE_DVB ("DVB - Region\n");
+ TRACE_DVB (L"DVB - Region\n");
break;
case CLUT :
ParseClut(gb, wSegLength);
- TRACE_DVB ("DVB - Clut \n");
+ TRACE_DVB (L"DVB - Clut \n");
break;
case OBJECT :
ParseObject(gb, wSegLength);
- TRACE_DVB ("DVB - Object\n");
+ TRACE_DVB (L"DVB - Object\n");
break;
case DISPLAY :
ParseDisplay(gb, wSegLength);
@@ -282,7 +280,7 @@
if (m_pCurrentPage.get() != NULL && m_rtStart != INVALID_TIME)
{
m_pCurrentPage->rtStop = m_rtStart;
- TRACE_DVB ("DVB - End display %S - %S\n", ReftimeToString(m_pCurrentPage->rtStart), ReftimeToString(m_pCurrentPage->rtStop));
+ TRACE_DVB (L"DVB - End display %s - %s\n", ReftimeToString(m_pCurrentPage->rtStart).c_str(), ReftimeToString(m_pCurrentPage->rtStop).c_str());
m_Pages.push_back (m_pCurrentPage.release());
}
break;
@@ -362,7 +360,7 @@
if (pPage->rtStop < rt)
{
if (!pPage->Rendered)
- TRACE_DVB ("DVB - remove unrendered object, %S - %S\n", ReftimeToString(pPage->rtStart), ReftimeToString(pPage->rtStop));
+ TRACE_DVB (L"DVB - remove unrendered object, %s - %s\n", ReftimeToString(pPage->rtStart).c_str(), ReftimeToString(pPage->rtStop).c_str());
//TRACE_HDMVSUB ("CHdmvSub:HDMV remove object %d %S => %S (rt=%S)\n", pPage->GetRLEDataSize(),
// ReftimeToString (pPage->rtStart), ReftimeToString(pPage->rtStop), ReftimeToString(rt));
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/HdmvSub.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/HdmvSub.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/HdmvSub.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -23,27 +23,29 @@
#include "StdAfx.h"
#include "HdmvSub.h"
#include "..\DSUtil\GolombBuffer.h"
+#include "..\subpic\ISubPic.h"
-#if (0) // Set to 1 to activate HDMV subtitles traces
+#if (1) // Set to 1 to activate HDMV subtitles traces
#define TRACE_HDMVSUB TRACE
#else
#define TRACE_HDMVSUB
#endif
-CHdmvSub::CHdmvSub(void)
- : CBaseSub(ST_HDMV)
+CHdmvSub::CHdmvSub(bool fromFile /*= false*/)
+ : CBaseSub(ST_HDMV), m_bFromFile(fromFile)
{
- m_nColorNumber = 0;
-
- m_nCurSegment = NO_SEGMENT;
- m_pSegBuffer = NULL;
- m_nTotalSegBuffer = 0;
- m_nSegBufferPos = 0;
- m_nSegSize = 0;
- m_pCurrentObject = NULL;
- m_pDefaultPalette = NULL;
+ m_nColorNumber = 0;
+ m_nCurSegment = NO_SEGMENT;
+ m_pSegBuffer = NULL;
+ m_nTotalSegBuffer = 0;
+ m_nSegBufferPos = 0;
+ m_nSegSize = 0;
+ m_pCurrentObject = NULL;
+ m_pDefaultPalette = NULL;
m_nDefaultPaletteNbEntry = 0;
+ m_bGotObjectData = false;
+ m_bGotPaletteData = false;
memset (&m_VideoDescriptor, 0, sizeof(VIDEO_DESCRIPTOR));
}
@@ -86,10 +88,13 @@
pObject = m_pObjects.front(); i++;
if (pObject->m_rtStop < rt)
{
- TRACE_HDMVSUB ("CHdmvSub:HDMV remove object %d %S => %S (rt=%S)\n", pObject->GetRLEDataSize(),
- ReftimeToString (pObject->m_rtStart), ReftimeToString(pObject->m_rtStop), ReftimeToString(rt));
- m_pObjects.pop_front(); i--;
- delete pObject;
+ if (!m_bFromFile)
+ {
+ TRACE_HDMVSUB (L"CHdmvSub:HDMV remove object %d %s => %s (rt=%s)\n", pObject->GetRLEDataSize(),
+ ReftimeToString (pObject->m_rtStart).c_str(), ReftimeToString(pObject->m_rtStop).c_str(), ReftimeToString(rt).c_str());
+ m_pObjects.pop_front(); i--;
+ delete pObject;
+ }
}
else
break;
@@ -98,29 +103,18 @@
return i;
}
-HRESULT CHdmvSub::ParseSample(IMediaSample* pSample)
+HRESULT CHdmvSub::ParseData( REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, BYTE* pData, long size )
{
- CheckPointer (pSample, E_POINTER);
- HRESULT hr;
- REFERENCE_TIME rtStart = INVALID_TIME, rtStop = INVALID_TIME;
- BYTE* pData = NULL;
- int lSampleLen;
-
- hr = pSample->GetPointer(&pData);
- if(FAILED(hr) || pData == NULL) return hr;
- lSampleLen = pSample->GetActualDataLength();
-
- pSample->GetTime(&rtStart, &rtStop);
if (pData)
{
- CGolombBuffer SampleBuffer (pData, lSampleLen);
+ CGolombBuffer SampleBuffer (pData, size);
while (!SampleBuffer.IsEOF())
{
if (m_nCurSegment == NO_SEGMENT)
{
HDMV_SEGMENT_TYPE nSegType = (HDMV_SEGMENT_TYPE)SampleBuffer.ReadByte();
USHORT nUnitSize = SampleBuffer.ReadShort();
- lSampleLen -=3;
+ size -= 3;
switch (nSegType)
{
@@ -147,33 +141,43 @@
{
if (m_nSegBufferPos < m_nSegSize)
{
- int nSize = min (m_nSegSize-m_nSegBufferPos, lSampleLen);
- SampleBuffer.ReadBuffer (m_pSegBuffer+m_nSegBufferPos, nSize);
+ int nSize = min(m_nSegSize - m_nSegBufferPos, size);
+ SampleBuffer.ReadBuffer(m_pSegBuffer + m_nSegBufferPos, nSize);
m_nSegBufferPos += nSize;
}
if (m_nSegBufferPos >= m_nSegSize)
{
- CGolombBuffer SegmentBuffer (m_pSegBuffer, m_nSegSize);
+ CGolombBuffer SegmentBuffer(m_pSegBuffer, m_nSegSize);
switch (m_nCurSegment)
{
case PALETTE :
- TRACE_HDMVSUB ("CHdmvSub:PALETTE rtStart=%10I64d\n", rtStart);
+ TRACE_HDMVSUB (L"CHdmvSub:PALETTE rtStart=%10I64d\n", rtStart);
ParsePalette(&SegmentBuffer, m_nSegSize);
+ m_bGotPaletteData = true;
break;
case OBJECT :
- //TRACE_HDMVSUB ("CHdmvSub:OBJECT %S\n", ReftimeToString(rtStart));
+ //TRACE_HDMVSUB (L"CHdmvSub:OBJECT rtStart=%s\n", ReftimeToString(rtStart).c_str());
ParseObject(&SegmentBuffer, m_nSegSize);
+ m_bGotObjectData = true;
break;
case PRESENTATION_SEG :
- TRACE_HDMVSUB ("CHdmvSub:PRESENTATION_SEG %S (size=%d)\n", ReftimeToString(rtStart), m_nSegSize);
+ TRACE_HDMVSUB (L"CHdmvSub:PRESENTATION_SEG rtStart=%s (size=%d)\n", ReftimeToString(rtStart).c_str(), m_nSegSize);
if (m_pCurrentObject)
{
+ if (! m_bGotObjectData)
+ {
+ // Sometimes, teh segment does not contain OBJECT data. Just use the data of the previous object
+ CompositionObject* pObject = m_pObjects.back();
+ m_pCurrentObject->Copy(pObject, !m_bGotPaletteData);
+ }
+ m_bGotObjectData = false;
+ m_bGotPaletteData = false;
m_pCurrentObject->m_rtStop = rtStart;
m_pObjects.push_back (m_pCurrentObject);
- TRACE_HDMVSUB ("CHdmvSub:HDMV : %S => %S\n", ReftimeToString (m_pCurrentObject->m_rtStart), ReftimeToString(rtStart));
+ TRACE_HDMVSUB (L"CHdmvSub:HDMV : %s => %s\n", ReftimeToString (m_pCurrentObject->m_rtStart).c_str(), ReftimeToString(rtStart).c_str());
m_pCurrentObject = NULL;
}
@@ -190,7 +194,7 @@
// TRACE_HDMVSUB ("CHdmvSub:END_OF_DISPLAY %S\n", ReftimeToString(rtStart));
break;
default :
- TRACE_HDMVSUB ("CHdmvSub:UNKNOWN Seg %d rtStart=0x%10dd\n", m_nCurSegment, rtStart);
+ TRACE_HDMVSUB (L"CHdmvSub:UNKNOWN Seg %d rtStart=0x%10dd\n", m_nCurSegment, rtStart);
}
m_nCurSegment = NO_SEGMENT;
@@ -199,9 +203,26 @@
}
}
- return hr;
+ return S_OK;
}
+HRESULT CHdmvSub::ParseSample(IMediaSample* pSample)
+{
+ CheckPointer (pSample, E_POINTER);
+ HRESULT hr;
+ REFERENCE_TIME rtStart = INVALID_TIME, rtStop = INVALID_TIME;
+ BYTE* pData = NULL;
+ int lSampleLen;
+
+ hr = pSample->GetPointer(&pData);
+ if(FAILED(hr) || pData == NULL) return hr;
+ lSampleLen = pSample->GetActualDataLength();
+
+ pSample->GetTime(&rtStart, &rtStop);
+
+ return ParseData(rtStart, rtStop, pData, lSampleLen);
+}
+
int CHdmvSub::ParsePresentationSegment(CGolombBuffer* pGBuffer)
{
COMPOSITION_DESCRIPTOR CompositionDescriptor;
@@ -212,8 +233,8 @@
ParseVideoDescriptor(pGBuffer, &m_VideoDescriptor);
ParseCompositionDescriptor(pGBuffer, &CompositionDescriptor);
palette_update_flag = !!(pGBuffer->ReadByte() & 0x80);
- palette_id_ref = pGBuffer->ReadByte();
- nObjectNumber = pGBuffer->ReadByte();
+ palette_id_ref = pGBuffer->ReadByte();
+ nObjectNumber = pGBuffer->ReadByte();
if (nObjectNumber > 0)
{
@@ -225,7 +246,7 @@
return nObjectNumber;
}
-void CHdmvSub::ParsePalette(CGolombBuffer* pGBuffer, USHORT nSize) // #497
+void CHdmvSub::ParsePalette(CGolombBuffer* pGBuffer, USHORT nSize) // #497
{
int nNbEntry;
BYTE palette_id = pGBuffer->ReadByte();
@@ -238,7 +259,7 @@
if (m_pDefaultPalette == NULL || m_nDefaultPaletteNbEntry != nNbEntry)
{
delete[] m_pDefaultPalette;
- m_pDefaultPalette = new HDMV_PALETTE[nNbEntry];
+ m_pDefaultPalette = new HDMV_PALETTE[nNbEntry];
m_nDefaultPaletteNbEntry = nNbEntry;
}
memcpy (m_pDefaultPalette, pPalette, nNbEntry*sizeof(HDMV_PALETTE));
@@ -249,8 +270,8 @@
void CHdmvSub::ParseObject(CGolombBuffer* pGBuffer, USHORT nUnitSize) // #498
{
- SHORT object_id = pGBuffer->ReadShort();
- BYTE m_sequence_desc;
+ SHORT object_id = pGBuffer->ReadShort();
+ BYTE m_sequence_desc;
ASSERT (m_pCurrentObject != NULL);
if (m_pCurrentObject)// && m_pCurrentObject->m_object_id_ref == object_id)
@@ -267,7 +288,7 @@
m_pCurrentObject->SetRLEData (pGBuffer->GetBufferPos(), nUnitSize-11, object_data_length-4);
- TRACE_HDMVSUB ("CHdmvSub:NewObject size=%ld, total obj=%d, %dx%d\n", object_data_length, m_pObjects.size(),
+ TRACE_HDMVSUB (L"CHdmvSub:NewObject size=%ld, total obj=%d, %dx%d\n", object_data_length, m_pObjects.size(),
m_pCurrentObject->m_width, m_pCurrentObject->m_height);
}
else
@@ -319,7 +340,7 @@
if (!pObject->HavePalette())
pObject->SetPalette (m_nDefaultPaletteNbEntry, m_pDefaultPalette, m_VideoDescriptor.nVideoWidth>720);
- TRACE_HDMVSUB ("CHdmvSub:Render size=%ld, ObjRes=%dx%d, SPDRes=%dx%d\n", pObject->GetRLEDataSize(),
+ TRACE_HDMVSUB (L"CHdmvSub:Render size=%ld, ObjRes=%dx%d, SPDRes=%dx%d\n", pObject->GetRLEDataSize(),
pObject->m_width, pObject->m_height, spd.w, spd.h);
pObject->RenderHdmv(spd);
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/HdmvSub.h
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/HdmvSub.h 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/HdmvSub.h 2010-09-04 09:57:36 UTC (rev 33519)
@@ -34,15 +34,15 @@
enum HDMV_SEGMENT_TYPE
{
- NO_SEGMENT = 0xFFFF,
- PALETTE = 0x14,
- OBJECT = 0x15,
- PRESENTATION_SEG = 0x16,
- WINDOW_DEF = 0x17,
- INTERACTIVE_SEG = 0x18,
- END_OF_DISPLAY = 0x80,
- HDMV_SUB1 = 0x81,
- HDMV_SUB2 = 0x82
+ NO_SEGMENT = 0xFFFF,
+ PALETTE = 0x14,
+ OBJECT = 0x15,
+ PRESENTATION_SEG = 0x16,
+ WINDOW_DEF = 0x17,
+ INTERACTIVE_SEG = 0x18,
+ END_OF_DISPLAY = 0x80,
+ HDMV_SUB1 = 0x81,
+ HDMV_SUB2 = 0x82
};
@@ -50,33 +50,34 @@
{
SHORT nVideoWidth;
SHORT nVideoHeight;
- BYTE bFrameRate; // <= Frame rate here!
+ BYTE bFrameRate; // <= Frame rate here!
};
struct COMPOSITION_DESCRIPTOR
{
SHORT nNumber;
- BYTE bState;
+ BYTE bState;
};
struct SEQUENCE_DESCRIPTOR
{
BYTE bFirstIn : 1;
- BYTE bLastIn : 1;
+ BYTE bLastIn : 1;
BYTE bReserved : 8;
};
- CHdmvSub();
+ CHdmvSub(bool fromFile = false);
~CHdmvSub();
HRESULT ParseSample (IMediaSample* pSample);
+ HRESULT ParseData( REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, BYTE* pData, long size );
int GetStartPosition(REFERENCE_TIME rt, double fps);
int GetNext(int pos) { return ((pos >= m_pObjects.size()) ? NULL : ++pos); };
- virtual REFERENCE_TIME GetStart(int nPos)
+ virtual REFERENCE_TIME GetStart(int nPos)
{
std::list<CompositionObject*>::iterator it = m_pObjects.begin();
std::advance(it, nPos - 1);
@@ -97,21 +98,24 @@
private :
- HDMV_SEGMENT_TYPE m_nCurSegment;
- BYTE* m_pSegBuffer;
- int m_nTotalSegBuffer;
- int m_nSegBufferPos;
- int m_nSegSize;
+ HDMV_SEGMENT_TYPE m_nCurSegment;
+ BYTE* m_pSegBuffer;
+ int m_nTotalSegBuffer;
+ int m_nSegBufferPos;
+ int m_nSegSize;
+ bool m_bGotObjectData;
+ bool m_bGotPaletteData;
+ bool m_bFromFile;
- VIDEO_DESCRIPTOR m_VideoDescriptor;
+ VIDEO_DESCRIPTOR m_VideoDescriptor;
- CompositionObject* m_pCurrentObject;
- std::list<CompositionObject*> m_pObjects;
+ CompositionObject* m_pCurrentObject;
+ std::list<CompositionObject*> m_pObjects;
- HDMV_PALETTE* m_pDefaultPalette;
- int m_nDefaultPaletteNbEntry;
+ HDMV_PALETTE* m_pDefaultPalette;
+ int m_nDefaultPaletteNbEntry;
- int m_nColorNumber;
+ int m_nColorNumber;
int ParsePresentationSegment(CGolombBuffer* pGBuffer);
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/RenderedHdmvSubtitle.cpp
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/RenderedHdmvSubtitle.cpp 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/RenderedHdmvSubtitle.cpp 2010-09-04 09:57:36 UTC (rev 33519)
@@ -25,6 +25,7 @@
#include "HdmvSub.h"
#include "DVBSub.h"
#include "RenderedHdmvSubtitle.h"
+#include "atlwfile.h"
CRenderedHdmvSubtitle::CRenderedHdmvSubtitle(CCritSec* pLock, SUBTITLE_TYPE nType)
: ISubPicProviderImpl(pLock)
@@ -69,7 +70,7 @@
STDMETHODIMP_(int) CRenderedHdmvSubtitle::GetStartPosition(REFERENCE_TIME rt, double fps)
{
CAutoLock cAutoLock(&m_csCritSec);
- return m_pSub->GetStartPosition(rt - m_rtStart, fps);
+ return m_pSub->GetStartPosition(rt - m_rtStart, fps);
}
STDMETHODIMP_(int) CRenderedHdmvSubtitle::GetNext(int pos)
@@ -177,3 +178,224 @@
return S_OK;
}
+
+CRenderedHdmvSubtitleFile::CRenderedHdmvSubtitleFile(CCritSec* pLock, SUBTITLE_TYPE nType)
+ : ISubPicProviderImpl(pLock)
+{
+ switch (nType)
+ {
+ case ST_DVB :
+ m_pSub = DNew CDVBSub();
+ m_name = "DVB Embedded Subtitle";
+ break;
+ case ST_HDMV :
+ m_pSub = DNew CHdmvSub(true);
+ m_name = "HDMV External Subtitle";
+ break;
+ default :
+ ASSERT (FALSE);
+ m_pSub = NULL;
+ }
+ m_rtStart = 0;
+}
+
+CRenderedHdmvSubtitleFile::~CRenderedHdmvSubtitleFile(void)
+{
+ delete m_pSub;
+}
+
+
+STDMETHODIMP CRenderedHdmvSubtitleFile::NonDelegatingQueryInterface(REFIID riid, void** ppv)
+{
+ CheckPointer(ppv, E_POINTER);
+ *ppv = NULL;
+
+ return
+ QI(IPersist)
+ QI(ISubStream)
+ QI(ISubPicProvider)
+ __super::NonDelegatingQueryInterface(riid, ppv);
+}
+
+// ISubPicProvider
+
+STDMETHODIMP_(int) CRenderedHdmvSubtitleFile::GetStartPosition(REFERENCE_TIME rt, double fps)
+{
+ CAutoLock cAutoLock(&m_csCritSec);
+ return m_pSub->GetStartPosition(rt - m_rtStart, fps);
+}
+
+STDMETHODIMP_(int) CRenderedHdmvSubtitleFile::GetNext(int pos)
+{
+ CAutoLock cAutoLock(&m_csCritSec);
+ return m_pSub->GetNext (pos);
+}
+
+STDMETHODIMP_(REFERENCE_TIME) CRenderedHdmvSubtitleFile::GetStart(int pos, double fps)
+{
+ CAutoLock cAutoLock(&m_csCritSec);
+ return m_pSub->GetStart(pos) + m_rtStart;
+}
+
+STDMETHODIMP_(REFERENCE_TIME) CRenderedHdmvSubtitleFile::GetStop(int pos, double fps)
+{
+ CAutoLock cAutoLock(&m_csCritSec);
+ return m_pSub->GetStop(pos) + m_rtStart;
+}
+
+STDMETHODIMP_(bool) CRenderedHdmvSubtitleFile::IsAnimated(int pos)
+{
+ return(false);
+}
+
+STDMETHODIMP CRenderedHdmvSubtitleFile::Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox)
+{
+ CAutoLock cAutoLock(&m_csCritSec);
+ m_pSub->Render (spd, rt - m_rtStart, bbox);
+
+ return S_OK;
+}
+
+STDMETHODIMP CRenderedHdmvSubtitleFile::GetTextureSize (int pos, SIZE& MaxTextureSize, SIZE& VideoSize, POINT& VideoTopLeft)
+{
+ CAutoLock cAutoLock(&m_csCritSec);
+ HRESULT hr = m_pSub->GetTextureSize(pos, MaxTextureSize, VideoSize, VideoTopLeft);
+ return hr;
+};
+
+// IPersist
+
+STDMETHODIMP CRenderedHdmvSubtitleFile::GetClassID(CLSID* pClassID)
+{
+ return pClassID ? *pClassID = __uuidof(this), S_OK : E_POINTER;
+}
+
+// ISubStream
+
+STDMETHODIMP_(int) CRenderedHdmvSubtitleFile::GetStreamCount()
+{
+ return (1);
+}
+
+STDMETHODIMP CRenderedHdmvSubtitleFile::GetStreamInfo(int iStream, WCHAR** ppName, LCID* pLCID)
+{
+ if(iStream != 0) return E_INVALIDARG;
+
+ if(ppName)
+ {
+ if(!(*ppName = (WCHAR*)CoTaskMemAlloc((m_name.GetLength()+1)*sizeof(WCHAR))))
+ return E_OUTOFMEMORY;
+
+ wcscpy_s (*ppName, m_name.GetLength()+1, CStdStringW(m_name));
+ }
+
+ if(pLCID)
+ {
+ *pLCID = m_lcid;
+ }
+
+ return S_OK;
+}
+
+STDMETHODIMP_(int) CRenderedHdmvSubtitleFile::GetStream()
+{
+ return(0);
+}
+
+STDMETHODIMP CRenderedHdmvSubtitleFile::SetStream(int iStream)
+{
+ return iStream == 0 ? S_OK : E_FAIL;
+}
+
+STDMETHODIMP CRenderedHdmvSubtitleFile::Reload()
+{
+ return S_OK;
+}
+
+HRESULT CRenderedHdmvSubtitleFile::ParseSample (IMediaSample* pSample)
+{
+ CAutoLock cAutoLock(&m_csCritSec);
+ HRESULT hr;
+
+ hr = m_pSub->ParseSample (pSample);
+ return hr;
+}
+
+bool CRenderedHdmvSubtitleFile::Open(CStdString fn)
+{
+ ATL::CFile f;
+ if(! f.Open(fn, ATL::CFile::modeRead|ATL::CFile::typeBinary|ATL::CFile::shareDenyNone))
+ return false;
+
+ //m_sub.SetLength(f.GetLength());
+ m_pMemBuffer.seekp(0); m_pMemBuffer.seekg(0);
+ m_pMemBuffer.str("");
+ m_pMemBuffer.clear();
+
+ int len = 0;
+ BYTE buff[2048];
+ while((len = f.Read(buff, sizeof(buff))) > 0)
+ {
+ m_pMemBuffer.write((const char*)buff, len);
+ if (m_pMemBuffer.bad())
+ return false;
+ }
+
+ m_pMemBuffer.seekg(0, std::ios_base::end);
+ uint64_t totalLen = m_pMemBuffer.tellg();
+ m_pMemBuffer.seekg(0);
+
+ while (! m_pMemBuffer.eof() && ! (m_pMemBuffer.tellg() > totalLen))
+ {
+
+ BYTE pData[4];
+ uint16_t header = 0;
+ REFERENCE_TIME rtStart = 0, rtStop = 0;
+ m_pMemBuffer.read((char *) &header, 2);
+ if (m_pMemBuffer.eof())
+ return true;
+
+ if (header != 0x4750)
+ return false;
+
+ m_pMemBuffer.read((char *) pData, 4);
+ rtStart = (pData[3] + ((int64_t)pData[2] << 8) + ((int64_t)pData[1] << 0x10) + ((int64_t)pData[0] << 0x18)) / 90;
+
+ m_pMemBuffer.read((char *) pData, 4);
+ rtStop = (pData[3] + ((int64_t)pData[2] << 8) + ((int64_t)pData[1] << 0x10) + ((int64_t)pData[0] << 0x18)) / 90;
+ //TRACE(L"Found PGS data: from %10I64dms to %10I64dms", rtStart, rtStop);
+
+ rtStart *= 10000;
+ rtStop *= 10000;
+ if (rtStop == 0)
+ rtStop = rtStart;
+
+ m_pMemBuffer.read((char *) pData, 3);
+ // pData[0] : segment type
+ size_t datalen = pData[2] + (((uint32_t)pData[1]) << 8);
+
+ BYTE * pBuffer = new BYTE[datalen + 3];
+ memcpy(pBuffer, pData, 3);
+ m_pMemBuffer.read((char *) &pBuffer[3], datalen);
+
+ if (FAILED(m_pSub->ParseData(rtStart, rtStop, pBuffer, datalen + 3)))
+ {
+ delete[] pBuffer;
+ return false;
+ }
+
+ delete[] pBuffer;
+ }
+
+ return true;
+}
+
+HRESULT CRenderedHdmvSubtitleFile::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
+{
+ CAutoLock cAutoLock(&m_csCritSec);
+
+ m_pSub->Reset();
+ m_rtStart = tStart;
+ return S_OK;
+}
+
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/RenderedHdmvSubtitle.h
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/RenderedHdmvSubtitle.h 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/RenderedHdmvSubtitle.h 2010-09-04 09:57:36 UTC (rev 33519)
@@ -26,8 +26,8 @@
#include "Rasterizer.h"
#include "..\SubPic\ISubPic.h"
#include "HdmvSub.h"
+#include <sstream>
-
class __declspec(uuid("FCA68599-C83E-4ea5-94A3-C2E1B0E326B9"))
CRenderedHdmvSubtitle : public ISubPicProviderImpl, public ISubStream
{
@@ -36,7 +36,7 @@
~CRenderedHdmvSubtitle(void);
DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
// ISubPicProvider
STDMETHODIMP_(int) GetStartPosition(REFERENCE_TIME rt, double fps);
@@ -58,13 +58,56 @@
STDMETHODIMP Reload();
HRESULT ParseSample (IMediaSample* pSample);
- HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
private :
CStdString m_name;
- LCID m_lcid;
+ LCID m_lcid;
REFERENCE_TIME m_rtStart;
- CBaseSub* m_pSub;
- CCritSec m_csCritSec;
+ CBaseSub* m_pSub;
+ CCritSec m_csCritSec;
};
+
+[uuid("2A5ACA12-7679-4DF2-96C1-5A9DE55D3717")]
+class CRenderedHdmvSubtitleFile : public ISubPicProviderImpl, public ISubStream
+{
+public:
+ CRenderedHdmvSubtitleFile(CCritSec* pLock, SUBTITLE_TYPE nType);
+ ~CRenderedHdmvSubtitleFile(void);
+ bool Open(CStdString fn);
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // ISubPicProvider
+ STDMETHODIMP_(int) GetStartPosition(REFERENCE_TIME rt, double fps);
+ STDMETHODIMP_(int) GetNext(int pos);
+ STDMETHODIMP_(REFERENCE_TIME) GetStart(int pos, double fps);
+ STDMETHODIMP_(REFERENCE_TIME) GetStop(int pos, double fps);
+ STDMETHODIMP_(bool) IsAnimated(int pos);
+ STDMETHODIMP Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox);
+ STDMETHODIMP GetTextureSize (int pos, SIZE& MaxTextureSize, SIZE& VirtualSize, POINT& VirtualTopLeft);
+
+ // IPersist
+ STDMETHODIMP GetClassID(CLSID* pClassID);
+
+ // ISubStream
+ STDMETHODIMP_(int) GetStreamCount();
+ STDMETHODIMP GetStreamInfo(int i, WCHAR** ppName, LCID* pLCID);
+ STDMETHODIMP_(int) GetStream();
+ STDMETHODIMP SetStream(int iStream);
+ STDMETHODIMP Reload();
+
+ HRESULT ParseSample (IMediaSample* pSample);
+ HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+private :
+ CStdString m_name;
+ LCID m_lcid;
+ REFERENCE_TIME m_rtStart;
+
+ std::stringstream m_pMemBuffer;
+ CBaseSub* m_pSub;
+ CCritSec m_csCritSec;
+};
Modified: branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/VobSubFile.h
===================================================================
--- branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/VobSubFile.h 2010-09-04 03:54:42 UTC (rev 33518)
+++ branches/dsplayer/xbmc/cores/DSPlayer/Subtitles/subtitles/VobSubFile.h 2010-09-04 09:57:36 UTC (rev 33519)
@@ -130,7 +130,7 @@
}
DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
// ISubPicProvider
STDMETHODIMP_(__w64 int) GetStartPosition(REFERENCE_TIME rt, double fps);
@@ -166,11 +166,11 @@
void Open(CStdString name, BYTE* pData, int len);
- void Add(REFERENCE_TIME tStart, REFERENCE_TIME tStop, BYTE* pData, int len);
+ void Add(REFERENCE_TIME tStart, REFERENCE_TIME tStop, BYTE* pData, int len);
void RemoveAll();
DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
// ISubPicProvider
STDMETHODIMP_(__w64 int) GetStartPosition(REFERENCE_TIME rt, double fps);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|