8 #include <lib/dvb/idemux.h>
9 #include <lib/dvb/subtitle.h>
10 #include <lib/base/smartptr.h>
11 #include <lib/base/eerror.h>
12 #include <lib/gdi/gpixmap.h>
14 void bitstream_init(struct bitstream *bit, const void *buffer, int size)
16 bit->data = (__u8*) buffer;
22 int bitstream_get(struct bitstream *bit)
25 bit->avail -= bit->size;
26 val = ((*bit->data) >> bit->avail) & ((1<<bit->size) - 1);
36 static int extract_pts(pts_t &pts, __u8 *pkt)
41 pkt++; // header length
43 if (flags & 0x80) /* PTS present? */
46 pts = ((unsigned long long)(((pkt[0] >> 1) & 7))) << 30;
48 pts |= (pkt[2]>>1) << 15;
57 void eDVBSubtitleParser::subtitle_process_line(struct subtitle_page *page, int object_id, int line, __u8 *data, int len)
59 struct subtitle_region *region = page->regions;
60 // eDebug("line for %d:%d", page->page_id, object_id);
63 struct subtitle_region_object *object = region->region_objects;
66 if (object->object_id == object_id)
68 int x = object->object_horizontal_position;
69 int y = object->object_vertical_position + line;
70 if (x + len > region->region_width)
72 //eDebug("[SUB] !!!! XCLIP %d + %d > %d", x, len, region->region_width);
73 len = region->region_width - x;
77 if (y >= region->region_height)
79 //eDebug("[SUB] !!!! YCLIP %d >= %d", y, region->region_height);
82 // //eDebug("inserting %d bytes (into region %d)", len, region->region_id);
83 memcpy((__u8*)region->region_buffer->surface->data + region->region_width * y + x, data, len);
85 object = object->next;
87 region = region->next;
91 int eDVBSubtitleParser::subtitle_process_pixel_data(struct subtitle_page *page, int object_id, int *linenr, int *linep, __u8 *data)
93 int data_type = *data++;
94 static __u8 line[720];
100 case 0x10: // 2bit pixel data
101 bitstream_init(&bit, data, 2);
105 int code = bitstream_get(&bit);
112 code = bitstream_get(&bit);
115 code = bitstream_get(&bit);
120 } else if (code == 2)
122 len = bitstream_get(&bit) << 2;
123 len |= bitstream_get(&bit);
125 col = bitstream_get(&bit);
126 } else if (code == 3)
128 len = bitstream_get(&bit) << 6;
129 len |= bitstream_get(&bit) << 4;
130 len |= bitstream_get(&bit) << 2;
131 len |= bitstream_get(&bit);
133 col = bitstream_get(&bit);
143 len = 3 + 4 + bitstream_get(&bit);
145 len = 3 + bitstream_get(&bit);
146 col = bitstream_get(&bit);
149 while (len && ((*linep) < 720))
151 line[(*linep)++] = col;
155 while (bit.avail != 8)
157 return bit.consumed + 1;
158 case 0x11: // 4bit pixel data
159 bitstream_init(&bit, data, 4);
163 int code = bitstream_get(&bit);
170 code = bitstream_get(&bit);
173 else if (code == 0xC)
177 } else if (code == 0xD)
184 len = (code & 7) + 2;
185 } else if ((code & 0xC) == 0x8)
187 col = bitstream_get(&bit);
188 len = (code & 3) + 4;
189 } else if (code == 0xE)
191 len = bitstream_get(&bit) + 9;
192 col = bitstream_get(&bit);
193 } else if (code == 0xF)
195 len = bitstream_get(&bit) << 4;
196 len |= bitstream_get(&bit);
198 col = bitstream_get(&bit);
201 while (len && ((*linep) < 720))
203 line[(*linep)++] = col;
207 while (bit.avail != 8)
209 return bit.consumed + 1;
210 case 0x12: // 8bit pixel data
211 bitstream_init(&bit, data, 8);
215 int code = bitstream_get(&bit);
222 code = bitstream_get(&bit);
223 if ((code & 0x80) == 0x80)
226 col = bitstream_get(&bit);
227 } else if (code&0x7F)
234 while (len && ((*linep) < 720))
236 line[(*linep)++] = col;
240 return bit.consumed + 1;
241 case 0x20: // ignore 2 -> 4bit map table
242 bitstream_init(&bit, data, 4);
243 for ( int i=0; i < 4; ++i )
246 case 0x21: // ignore 2 -> 8bit map table
247 bitstream_init(&bit, data, 8);
248 for ( int i=0; i < 4; ++i )
251 case 0x22: // ignore 4 -> 8bit map table
252 bitstream_init(&bit, data, 8);
253 for ( int i=0; i < 16; ++i )
257 subtitle_process_line(page, object_id, *linenr, line, *linep);
260 for (i=0; i<720; ++i)
261 //eDebugNoNewLine("%d ", line[i]);
264 (*linenr)+=2; // interlaced
266 // //eDebug("[SUB] EOL");
269 eDebug("subtitle_process_pixel_data: invalid data_type %02x", data_type);
275 int eDVBSubtitleParser::subtitle_process_segment(__u8 *segment)
277 int segment_type, page_id, segment_length, processed_length;
278 if (*segment++ != 0x0F)
280 eDebug("out of sync.");
283 segment_type = *segment++;
284 page_id = *segment++ << 8;
285 page_id |= *segment++;
286 segment_length = *segment++ << 8;
287 segment_length |= *segment++;
288 if (segment_type == 0xFF)
289 return segment_length + 6;
290 // //eDebug("have %d bytes of segment data", segment_length);
292 // //eDebug("page_id %d, segtype %02x", page_id, segment_type);
294 struct subtitle_page *page, **ppage;
296 page = this->pages; ppage = &this->pages;
300 if (page->page_id == page_id)
306 processed_length = 0;
308 switch (segment_type)
310 case 0x10: // page composition segment
312 int page_time_out = *segment++; processed_length++;
313 int page_version_number = *segment >> 4;
314 int page_state = (*segment >> 2) & 0x3;
315 //eDebug("pcs with %d bytes data (%d:%d:%d)", segment_length, page_id, page_version_number, page_state);
319 //eDebug("page time out: %d", page_time_out);
320 //eDebug("page_version_number: %d" ,page_version_number);
321 //eDebug("page_state: %d", page_state);
325 //eDebug("page not found");
326 page = new subtitle_page;
327 page->page_regions = 0;
329 page->page_id = page_id;
335 if (page->pcs_size != segment_length)
336 page->page_version_number = -1;
337 // if no update, just skip this data.
338 if (page->page_version_number == page_version_number)
340 eDebug("skip data... ");
345 // eDebug("page updated: old: %d, new: %d", page->page_version_number, page_version_number);
346 // when acquisition point or mode change: remove all displayed pages.
347 if ((page_state == 1) || (page_state == 2))
349 while (page->page_regions)
351 struct subtitle_page_region *p = page->page_regions->next;
352 delete page->page_regions;
353 page->page_regions = p;
357 // eDebug("new page.. (%d)", page_state);
359 page->page_time_out = page_time_out;
361 page->page_version_number = page_version_number;
363 struct subtitle_page_region **r = &page->page_regions;
365 //eDebug("%d / %d data left", processed_length, segment_length);
371 while (processed_length < segment_length)
373 struct subtitle_page_region *pr;
375 // append new entry to list
376 pr = new subtitle_page_region;
381 pr->region_id = *segment++; processed_length++;
382 segment++; processed_length++;
384 pr->region_horizontal_address = *segment++ << 8;
385 pr->region_horizontal_address |= *segment++;
386 processed_length += 2;
388 pr->region_vertical_address = *segment++ << 8;
389 pr->region_vertical_address |= *segment++;
390 processed_length += 2;
392 //eDebug("appended active region");
395 if (processed_length != segment_length)
396 eDebug("%d != %d", processed_length, segment_length);
399 case 0x11: // region composition segment
401 int region_id = *segment++; processed_length++;
402 int region_version_number = *segment >> 4;
403 int region_fill_flag = (*segment >> 3) & 1;
404 segment++; processed_length++;
406 // if we didn't yet received the pcs for this page, drop the region
409 eDebug("ignoring region %x, since page %02x doesn't yet exist.", region_id, page_id);
413 struct subtitle_region *region, **pregion;
415 region = page->regions; pregion = &page->regions;
420 if (region->region_id == region_id)
422 pregion = ®ion->next;
423 region = region->next;
428 *pregion = region = new subtitle_region;
431 else if (region->region_version_number != region_version_number)
433 struct subtitle_region_object *objects = region->region_objects;
436 struct subtitle_region_object *n = objects->next;
440 if (region->region_buffer)
442 if (region->region_buffer->surface)
443 delete region->region_buffer->surface;
444 region->region_buffer=0;
450 //eDebug("region %d:%d update", page_id, region_id);
452 region->region_id = region_id;
453 region->region_version_number = region_version_number;
455 region->region_width = *segment++ << 8;
456 region->region_width |= *segment++;
457 processed_length += 2;
459 region->region_height = *segment++ << 8;
460 region->region_height |= *segment++;
461 processed_length += 2;
463 region->region_buffer = new gPixmap(eSize(region->region_width, region->region_height), 8);
465 int region_level_of_compatibility, region_depth;
467 region_level_of_compatibility = (*segment >> 5) & 7;
468 region_depth = (*segment++ >> 2) & 7;
469 region->region_depth = (subtitle_region::depth) region_depth;
472 int CLUT_id = *segment++; processed_length++;
474 region->clut_id = CLUT_id;
476 int region_8bit_pixel_code, region_4bit_pixel_code, region_2bit_pixel_code;
477 region_8bit_pixel_code = *segment++; processed_length++;
478 region_4bit_pixel_code = *segment >> 4;
479 region_2bit_pixel_code = (*segment++ >> 2) & 3;
482 if (!region_fill_flag)
484 region_2bit_pixel_code = region_4bit_pixel_code = region_8bit_pixel_code = 0;
485 region_fill_flag = 1;
488 if (region_fill_flag)
490 if (region_depth == 1)
491 memset(region->region_buffer->surface->data, region_2bit_pixel_code, region->region_height * region->region_width);
492 else if (region_depth == 2)
493 memset(region->region_buffer->surface->data, region_4bit_pixel_code, region->region_height * region->region_width);
494 else if (region_depth == 3)
495 memset(region->region_buffer->surface->data, region_8bit_pixel_code, region->region_height * region->region_width);
497 eDebug("!!!! invalid depth");
500 //eDebug("region %02x, version %d, %dx%d", region->region_id, region->region_version_number, region->region_width, region->region_height);
502 region->region_objects = 0;
503 struct subtitle_region_object **pobject = ®ion->region_objects;
505 while (processed_length < segment_length)
508 struct subtitle_region_object *object;
510 object = new subtitle_region_object;
514 pobject = &object->next;
516 object->object_id = *segment++ << 8;
517 object->object_id |= *segment++; processed_length += 2;
519 object->object_type = *segment >> 6;
520 object->object_provider_flag = (*segment >> 4) & 3;
521 object->object_horizontal_position = (*segment++ & 0xF) << 8;
522 object->object_horizontal_position |= *segment++;
523 processed_length += 2;
525 object->object_vertical_position = *segment++ << 8;
526 object->object_vertical_position |= *segment++ ;
527 processed_length += 2;
529 if ((object->object_type == 1) || (object->object_type == 2))
531 object->foreground_pixel_value = *segment++;
532 object->background_pixel_value = *segment++;
533 processed_length += 2;
537 if (processed_length != segment_length)
538 eDebug("too less data! (%d < %d)", segment_length, processed_length);
542 case 0x12: // CLUT definition segment
544 int CLUT_id, CLUT_version_number;
545 struct subtitle_clut *clut, **pclut;
550 //eDebug("CLUT: %02x", *segment);
551 CLUT_id = *segment++;
553 CLUT_version_number = *segment++ >> 4;
554 processed_length += 2;
556 //eDebug("page %d, CLUT %02x, version %d", page->page_id, CLUT_id, CLUT_version_number);
558 clut = page->cluts; pclut = &page->cluts;
562 if (clut->clut_id == CLUT_id)
570 *pclut = clut = new subtitle_clut;
572 clut->clut_id = CLUT_id;
574 else if (clut->CLUT_version_number == CLUT_version_number)
577 clut->CLUT_version_number=CLUT_version_number;
578 clut->size_2 = clut->size_4 = clut->size_8 = 0;
580 /* invalidate CLUT if updated. */
581 if ((this->current_clut_page_id == page_id) && (this->current_clut_id == CLUT_id))
582 this->current_clut_id = -1;
584 //eDebug("new clut");
585 while (processed_length < segment_length)
587 int CLUT_entry_id, entry_CLUT_flag, full_range;
588 int v_Y, v_Cr, v_Cb, v_T;
590 CLUT_entry_id = *segment++;
591 full_range = *segment & 1;
592 entry_CLUT_flag = (*segment++ & 0xE0) >> 5;
593 processed_length += 2;
601 processed_length += 4;
604 v_Y = *segment & 0xFC;
605 v_Cr = (*segment++ & 3) << 6;
606 v_Cr |= (*segment & 0xC0) >> 2;
607 v_Cb = (*segment & 0x3C) << 2;
608 v_T = (*segment++ & 3) << 6;
609 processed_length += 2;
612 if (entry_CLUT_flag & 1) // 8bit
614 ASSERT(CLUT_entry_id < 256);
616 clut->entries_8bit[CLUT_entry_id].Y = v_Y;
617 clut->entries_8bit[CLUT_entry_id].Cr = v_Cr;
618 clut->entries_8bit[CLUT_entry_id].Cb = v_Cb;
619 clut->entries_8bit[CLUT_entry_id].T = v_T;
621 if (entry_CLUT_flag & 2) // 4bit
623 ASSERT(CLUT_entry_id < 16);
625 clut->entries_4bit[CLUT_entry_id].Y = v_Y;
626 clut->entries_4bit[CLUT_entry_id].Cr = v_Cr;
627 clut->entries_4bit[CLUT_entry_id].Cb = v_Cb;
628 clut->entries_4bit[CLUT_entry_id].T = v_T;
630 if (entry_CLUT_flag & 4) // 2bit
632 ASSERT(CLUT_entry_id < 4);
634 clut->entries_2bit[CLUT_entry_id].Y = v_Y;
635 clut->entries_2bit[CLUT_entry_id].Cr = v_Cr;
636 clut->entries_2bit[CLUT_entry_id].Cb = v_Cb;
637 clut->entries_2bit[CLUT_entry_id].T = v_T;
639 //eDebug(" %04x %02x %02x %02x %02x", CLUT_entry_id, v_Y, v_Cb, v_Cr, v_T);
643 case 0x13: // object data segment
645 int object_id, object_version_number, object_coding_method, non_modifying_color_flag;
647 object_id = *segment++ << 8;
648 object_id |= *segment++;
649 processed_length += 2;
651 object_version_number = *segment >> 4;
652 object_coding_method = (*segment >> 2) & 3;
653 non_modifying_color_flag = (*segment++ >> 1) & 1;
656 //eDebug("object id %04x, version %d, object_coding_method %d (page_id %d)", object_id, object_version_number, object_coding_method, page_id);
658 if (object_coding_method == 0)
660 int top_field_data_blocklength, bottom_field_data_blocklength;
663 top_field_data_blocklength = *segment++ << 8;
664 top_field_data_blocklength |= *segment++;
666 bottom_field_data_blocklength = *segment++ << 8;
667 bottom_field_data_blocklength |= *segment++;
668 //eDebug("%d / %d bytes", top_field_data_blocklength, bottom_field_data_blocklength);
669 processed_length += 4;
674 while (i < top_field_data_blocklength)
677 len = subtitle_process_pixel_data(page, object_id, &line, &linep, segment);
681 processed_length += len;
688 if (bottom_field_data_blocklength)
691 while (i < bottom_field_data_blocklength)
694 len = subtitle_process_pixel_data(page, object_id, &line, &linep, segment);
698 processed_length += len;
702 else if (top_field_data_blocklength)
703 eDebug("!!!! unimplemented: no bottom field! (%d : %d)", top_field_data_blocklength, bottom_field_data_blocklength);
705 if ((top_field_data_blocklength + bottom_field_data_blocklength) & 1)
707 segment++; processed_length++;
710 else if (object_coding_method == 1)
711 eDebug("---- object_coding_method 1 unsupported!");
715 case 0x80: // end of display set segment
717 // eDebug("end of display set segment");
718 subtitle_redraw_all();
720 case 0xFF: // stuffing
723 eDebug("unhandled segment type %02x", segment_type);
726 return segment_length + 6;
729 void eDVBSubtitleParser::subtitle_process_pes(__u8 *pkt, int len)
731 eDebug("subtitle_process_pes");
732 if (!extract_pts(show_time, pkt))
739 int hdr_len = *pkt++; len--;
741 pkt+=hdr_len; len-=hdr_len;
745 //eDebug("data identifier is 0x%02x, but not 0x20", *pkt);
748 pkt++; len--; // data identifier
749 *pkt++; len--; // stream id;
753 //eDebug("no data left (%d)", len);
757 while (len && *pkt == 0x0F)
759 int l = subtitle_process_segment(pkt);
765 // if (len && *pkt != 0xFF)
766 // eDebug("strange data at the end");
769 eDebug("dvb subtitle packet without PTS.. ignore!!");
772 void eDVBSubtitleParser::subtitle_clear_screen()
777 //eDebug("BBOX clear %d:%d -> %d:%d", this->bbox_left, this->bbox_top, this->bbox_right, this->bbox_bottom);
779 // do not draw when anyone has locked the
780 // framebuffer ( non enigma plugins... )
781 this->bbox_right = 720;
782 if (this->bbox_right > this->bbox_left)
783 for (y=this->bbox_top; y < this->bbox_bottom; ++y)
784 ; // TODO fixmee clear subtitle screen
786 this->bbox_right = 0;
787 this->bbox_left = this->screen_width;
788 this->bbox_top = this->screen_height;
789 this->bbox_bottom = 0;
792 void eDVBSubtitleParser::subtitle_redraw_all()
795 struct subtitle_page *page = this->pages;
798 struct subtitle_page_region *region = page->page_regions;
800 subtitle_clear_screen();
804 subtitle_redraw(page->page_id);
808 subtitle_clear_screen();
810 struct subtitle_page *page = this->pages;
811 //eDebug("----------- end of display set");
812 //eDebug("active pages:");
815 //eDebug(" page_id %02x", page->page_id);
816 //eDebug(" page_version_number: %d", page->page_version_number);
817 //eDebug(" active regions:");
819 struct subtitle_page_region *region = page->page_regions;
822 //eDebug(" region_id: %04x", region->region_id);
823 //eDebug(" region_horizontal_address: %d", region->region_horizontal_address);
824 //eDebug(" region_vertical_address: %d", region->region_vertical_address);
826 region = region->next;
830 subtitle_redraw(page->page_id);
831 //eDebug("defined regions:");
832 struct subtitle_region *region = page->regions;
835 //eDebug(" region_id %04x, version %d, %dx%d", region->region_id, region->region_version_number, region->region_width, region->region_height);
837 struct subtitle_region_object *object = region->region_objects;
840 //eDebug(" object %02x, type %d, %d:%d", object->object_id, object->object_type, object->object_horizontal_position, object->object_vertical_position);
841 object = object->next;
843 region = region->next;
850 void eDVBSubtitleParser::subtitle_reset()
852 while (struct subtitle_page *page = this->pages)
854 /* free page regions */
855 while (page->page_regions)
857 struct subtitle_page_region *p = page->page_regions->next;
858 delete page->page_regions;
859 page->page_regions = p;
862 while (page->regions)
864 struct subtitle_region *region = page->regions;
866 while (region->region_objects)
868 struct subtitle_region_object *obj = region->region_objects;
869 region->region_objects = obj->next;
873 if (region->region_buffer)
875 if (region->region_buffer->surface)
876 delete region->region_buffer->surface;
877 region->region_buffer=0;
880 page->regions = region->next;
887 struct subtitle_clut *clut = page->cluts;
888 page->cluts = clut->next;
892 this->pages = page->next;
897 void eDVBSubtitleParser::subtitle_redraw(int page_id)
899 struct subtitle_page *page = this->pages;
901 //eDebug("displaying page id %d", page_id);
905 if (page->page_id == page_id)
911 //eDebug("page not found");
916 //eDebug("iterating regions..");
917 /* iterate all regions in this pcs */
918 struct subtitle_page_region *region = page->page_regions;
921 //eDebug("region %d", region->region_id);
922 /* find corresponding region */
923 struct subtitle_region *reg = page->regions;
926 if (reg->region_id == region->region_id)
933 //eDebug("copy region %d to %d, %d", region->region_id, region->region_horizontal_address, region->region_vertical_address);
935 int x0 = region->region_horizontal_address;
936 int y0 = region->region_vertical_address;
937 int x1 = x0 + reg->region_width;
938 int y1 = y0 + reg->region_height;
940 if ((x0 < 0) || (y0 < 0) || (x0 > this->screen_width) || (x0 > this->screen_height))
944 if (x0 < this->bbox_left)
945 this->bbox_left = x0;
946 if (y0 < this->bbox_top)
948 if (x1 > this->bbox_right)
949 this->bbox_right = x1;
950 if (y1 > this->bbox_bottom)
951 this->bbox_bottom = y1;
953 int timeout = page->page_time_out;
955 /* find corresponding clut */
956 struct subtitle_clut *clut = page->cluts;
959 //eDebug("have %d, want %d", clut->clut_id, main_clut_id);
960 if (clut->clut_id == reg->clut_id)
966 // TODO fill region->surface->clut !!!!!
970 // apply default clut depending on region->region_depth
971 // TODO fill region->surface->clut !!!!!
973 // TODO Blit Region Pixmap !!!
974 eDebug("blit region");
977 eDebug("region not found");
978 region = region->next;
980 //eDebug("schon gut.");
983 DEFINE_REF(eDVBSubtitleParser);
985 eDVBSubtitleParser::eDVBSubtitleParser(iDVBDemux *demux)
990 if (demux->createPESReader(eApp, m_pes_reader))
991 eDebug("failed to create dvb subtitle PES reader!");
993 m_pes_reader->connectRead(slot(*this, &eDVBSubtitleParser::processData), m_read_connection);
996 eDVBSubtitleParser::~eDVBSubtitleParser()
1001 int eDVBSubtitleParser::start(int pid)
1004 eDebug("eDVBSubtitleParser::start(%04x)", pid);
1006 return m_pes_reader->start(pid);
1012 void eDVBSubtitleParser::connectNewRegion(const Slot1<void, const eDVBSubtitleRegion&> &slot, ePtr<eConnection> &connection)
1014 connection = new eConnection(this, m_new_subtitle_region.connect(slot));