X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fsubtitle.h;h=09d6cd473b9a81476cd7f60d29ebc869dd8869b7;hp=6faad507e6eb582444ad0ad6050b81e95f15ce73;hb=6ae5d719b93de2e8897a660ac61b0e9c5a190dde;hpb=ad5b517b4648c91ec34936ac5eba7cde4c34bb31 diff --git a/lib/dvb/subtitle.h b/lib/dvb/subtitle.h index 6faad50..09d6cd4 100644 --- a/lib/dvb/subtitle.h +++ b/lib/dvb/subtitle.h @@ -11,17 +11,17 @@ typedef unsigned char __u8; struct subtitle_clut_entry { __u8 Y, Cr, Cb, T; + __u8 valid; }; struct subtitle_clut { unsigned char clut_id; - unsigned char size_2, size_4, size_8; unsigned char CLUT_version_number; - struct subtitle_clut_entry entries_2bit[4]; - struct subtitle_clut_entry entries_4bit[16]; - struct subtitle_clut_entry entries_8bit[256]; - struct subtitle_clut *next; + subtitle_clut_entry entries_2bit[4]; + subtitle_clut_entry entries_4bit[16]; + subtitle_clut_entry entries_8bit[256]; + subtitle_clut *next; }; struct subtitle_page_region @@ -29,7 +29,7 @@ struct subtitle_page_region int region_id; int region_horizontal_address; int region_vertical_address; - struct subtitle_page_region *next; + subtitle_page_region *next; }; struct subtitle_region_object @@ -45,7 +45,7 @@ struct subtitle_region_object int foreground_pixel_value; int background_pixel_value; - struct subtitle_region_object *next; + subtitle_region_object *next; }; struct subtitle_region @@ -54,13 +54,16 @@ struct subtitle_region int region_version_number; int region_height, region_width; enum depth { bpp2=1, bpp4=2, bpp8=3 } region_depth; + ePtr region_buffer; int clut_id; - struct subtitle_region_object *region_objects; + subtitle_region_object *region_objects; + + subtitle_region *next; - struct subtitle_region *next; + bool committed; }; struct subtitle_page @@ -68,14 +71,15 @@ struct subtitle_page int page_id; time_t page_time_out; int page_version_number; + int state; int pcs_size; - struct subtitle_page_region *page_regions; + subtitle_page_region *page_regions; - struct subtitle_region *regions; + subtitle_region *regions; - struct subtitle_clut *cluts; + subtitle_clut *cluts; - struct subtitle_page *next; + subtitle_page *next; }; struct bitstream @@ -88,34 +92,43 @@ struct bitstream struct eDVBSubtitleRegion { - pts_t show_time; - int timeout; - ePtr region; + ePtr m_pixmap; + ePoint m_position; + eDVBSubtitleRegion &operator=(const eDVBSubtitleRegion &s) + { + m_pixmap = s.m_pixmap; + m_position = s.m_position; + return *this; + } +}; + +struct eDVBSubtitlePage +{ + std::list m_regions; + pts_t m_show_time; }; class eDVBSubtitleParser :public iObject, public ePESParser, public Object { DECLARE_REF(eDVBSubtitleParser); - struct subtitle_page *pages; - int current_clut_id, current_clut_page_id; - int screen_width, screen_height; - int bbox_left, bbox_top, bbox_right, bbox_bottom; + subtitle_page *m_pages; ePtr m_pes_reader; ePtr m_read_connection; - pts_t show_time; - Signal1 m_new_subtitle_region; + pts_t m_show_time; + Signal1 m_new_subtitle_page; + int m_composition_page_id, m_ancillary_page_id; public: eDVBSubtitleParser(iDVBDemux *demux); virtual ~eDVBSubtitleParser(); - int start(int pid); - void connectNewRegion(const Slot1 &slot, ePtr &connection); + int start(int pid, int composition_page_id, int ancillary_page_id); + int stop(); + void connectNewPage(const Slot1 &slot, ePtr &connection); private: - void subtitle_process_line(struct subtitle_page *page, int object_id, int line, __u8 *data, int len); - int subtitle_process_pixel_data(struct subtitle_page *page, int object_id, int *linenr, int *linep, __u8 *data); + void subtitle_process_line(subtitle_page *page, int object_id, int line, __u8 *data, int len); + int subtitle_process_pixel_data(subtitle_page *page, int object_id, int *linenr, int *linep, __u8 *data); int subtitle_process_segment(__u8 *segment); void subtitle_process_pes(__u8 *buffer, int len); - void subtitle_clear_screen(); void subtitle_redraw_all(); void subtitle_reset(); void subtitle_redraw(int page_id);