diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2010-12-05 01:57:48 +0100 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2010-12-05 01:58:35 +0100 |
| commit | fb6ff3b0e154f65d63defaf259069b13ef1eb039 (patch) | |
| tree | d65aa833a3ee5b6c882a5d23e41c0d1713713dda /lib | |
| parent | 25e47fc733db4df71494b761184961941778c72f (diff) | |
| download | enigma2-fb6ff3b0e154f65d63defaf259069b13ef1eb039.tar.gz enigma2-fb6ff3b0e154f65d63defaf259069b13ef1eb039.zip | |
small code cleanup, fix memleaks
refs #537
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/gui/esubtitle.h | 8 | ||||
| -rw-r--r-- | lib/service/servicemp3.cpp | 65 | ||||
| -rw-r--r-- | lib/service/servicemp3.h | 13 |
3 files changed, 38 insertions, 48 deletions
diff --git a/lib/gui/esubtitle.h b/lib/gui/esubtitle.h index 2b0ec8ff..cdad7286 100644 --- a/lib/gui/esubtitle.h +++ b/lib/gui/esubtitle.h @@ -23,7 +23,7 @@ struct ePangoSubtitlePageElement struct ePangoSubtitlePage { - pts_t show_pts; + pts_t m_show_pts; int m_timeout; /* in milliseconds */ std::vector<ePangoSubtitlePageElement> m_elements; void clear() { m_elements.clear(); } @@ -31,15 +31,13 @@ struct ePangoSubtitlePage struct eVobSubtitlePage { - pts_t show_pts; + pts_t m_show_pts; int m_timeout; /* in milliseconds */ ePtr<gPixmap> m_pixmap; }; class eDVBTeletextSubtitlePage; -class eDVBPangoSubtitlePage; -class ePangoSubtitlePage; -class eVobSubtitlePage; +class eDVBSubtitlePage; class eSubtitleWidget: public eWidget, public Object { diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 4399dd23..b1354108 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -1964,35 +1964,28 @@ void eServiceMP3::pullSubtitle() if ( m_subtitleStreams[m_currentSubtitleStream].type < stVOB ) { unsigned char line[len+1]; + SubtitlePage page; memcpy(line, GST_BUFFER_DATA(buffer), len); line[len] = 0; eDebug("got new text subtitle @ buf_pos = %lld ns (in pts=%lld): '%s' ", buf_pos, buf_pos/11111, line); - ePangoSubtitlePage* page = new ePangoSubtitlePage; gRGB rgbcol(0xD0,0xD0,0xD0); - page->m_elements.push_back(ePangoSubtitlePageElement(rgbcol, (const char*)line)); - page->show_pts = buf_pos / 11111L; - page->m_timeout = duration_ns / 1000000; - SubtitlePage subtitlepage; - subtitlepage.pango_page = page; - subtitlepage.vob_page = NULL; - m_subtitle_pages.push_back(subtitlepage); + page.type = SubtitlePage::Pango; + page.pango_page.m_elements.push_back(ePangoSubtitlePageElement(rgbcol, (const char*)line)); + page.pango_page.m_show_pts = buf_pos / 11111L; + page.pango_page.m_timeout = duration_ns / 1000000; + m_subtitle_pages.push_back(page); pushSubtitles(); } else if ( m_subtitleStreams[m_currentSubtitleStream].type == stVOB ) { + SubtitlePage page; eDebug("got new subpicture @ buf_pos = %lld ns (in pts=%lld), duration=%lld ns, len=%i bytes. ", buf_pos, buf_pos/11111, duration_ns, len); - eVobSubtitlePage* page = new eVobSubtitlePage; - eSize size = eSize(720, 576); - page->m_pixmap = new gPixmap(size, 32, 0); - // ePtr<gPixmap> pixmap; - // pixmap = new gPixmap(size, 32, 1); /* allocate accel surface (if possible) */ - memcpy(page->m_pixmap->surface->data, GST_BUFFER_DATA(buffer), len); - page->show_pts = buf_pos / 11111L; - page->m_timeout = duration_ns / 1000; - SubtitlePage subtitlepage; - subtitlepage.vob_page = page; - subtitlepage.pango_page = NULL; - m_subtitle_pages.push_back(subtitlepage); + page.type = SubtitlePage::Vob; + page.vob_page.m_pixmap = new gPixmap(eSize(720, 576), 32, 1); + memcpy(page.vob_page.m_pixmap->surface->data, GST_BUFFER_DATA(buffer), len); + page.vob_page.m_show_pts = buf_pos / 11111L; + page.vob_page.m_timeout = duration_ns / 1000; + m_subtitle_pages.push_back(page); pushSubtitles(); } else @@ -2014,17 +2007,17 @@ void eServiceMP3::pushSubtitles() pts_t running_pts; while ( !m_subtitle_pages.empty() ) { - SubtitlePage frontpage = m_subtitle_pages.front(); + SubtitlePage &frontpage = m_subtitle_pages.front(); gint64 diff_ms = 0; - gint64 show_pts = 0; - + gint64 show_pts; + + if (frontpage.type == SubtitlePage::Pango) + show_pts = frontpage.pango_page.m_show_pts; + else + show_pts = frontpage.vob_page.m_show_pts; + getPlayPosition(running_pts); - - if ( frontpage.pango_page != 0 ) - show_pts = frontpage.pango_page->show_pts; - else if ( frontpage.vob_page != 0 ) - show_pts = frontpage.vob_page->show_pts; - + diff_ms = ( show_pts - running_pts ) / 90; GstFormat fmt = GST_FORMAT_TIME; gint64 now; @@ -2057,15 +2050,13 @@ void eServiceMP3::pushSubtitles() { if ( m_subtitle_widget ) { - if ( frontpage.pango_page != 0) - { - m_subtitle_widget->setPage(*(frontpage.pango_page)); - } - else if ( frontpage.vob_page != 0) + if ( frontpage.type == SubtitlePage::Pango) + m_subtitle_widget->setPage(frontpage.pango_page); + else { - m_subtitle_widget->setPixmap(frontpage.vob_page->m_pixmap, eRect(0, 0, 720, 576)); - eDebug("blit vobsub pixmap... hide in %i ms", frontpage.vob_page->m_timeout); - m_subtitle_hide_timer->start(frontpage.vob_page->m_timeout, true); + m_subtitle_widget->setPixmap(frontpage.vob_page.m_pixmap, eRect(0, 0, 720, 576)); + eDebug("blit vobsub pixmap... hide in %i ms", frontpage.vob_page.m_timeout); + m_subtitle_hide_timer->start(frontpage.vob_page.m_timeout, true); } m_subtitle_widget->show(); } diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index 1c87ad77..744f62a5 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -49,12 +49,6 @@ typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFL typedef enum { stUnknown, stPlainText, stSSA, stASS, stSRT, stVOB, stPGS } subtype_t; typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t; -struct SubtitlePage -{ - ePangoSubtitlePage *pango_page; - eVobSubtitlePage *vob_page; -}; - class eServiceMP3: public iPlayableService, public iPauseableService, public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public iStreamedService, public iAudioDelay, public Object @@ -254,6 +248,13 @@ private: GstSegment m_gst_subtitle_segment; GstPadEventFunction m_gst_sink_event; + struct SubtitlePage + { + enum { Unknown, Pango, Vob } type; + ePangoSubtitlePage pango_page; + eVobSubtitlePage vob_page; + }; + std::list<SubtitlePage> m_subtitle_pages; ePtr<eTimer> m_subtitle_sync_timer; ePtr<eTimer> m_subtitle_hide_timer; |
