Merge remote-tracking branch 'qatar/master'
[ffmpeg.git] / libavcodec / dvbsubdec.c
1 /*
2  * DVB subtitle decoding for ffmpeg
3  * Copyright (c) 2005 Ian Caulfield
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #include "avcodec.h"
22 #include "dsputil.h"
23 #include "get_bits.h"
24 #include "bytestream.h"
25 #include "libavutil/colorspace.h"
26
27 #define DVBSUB_PAGE_SEGMENT     0x10
28 #define DVBSUB_REGION_SEGMENT   0x11
29 #define DVBSUB_CLUT_SEGMENT     0x12
30 #define DVBSUB_OBJECT_SEGMENT   0x13
31 #define DVBSUB_DISPLAYDEFINITION_SEGMENT 0x14
32 #define DVBSUB_DISPLAY_SEGMENT  0x80
33
34 #define cm (ff_cropTbl + MAX_NEG_CROP)
35
36 #ifdef DEBUG
37 #undef fprintf
38 #if 0
39 static void png_save(const char *filename, uint8_t *bitmap, int w, int h,
40                      uint32_t *rgba_palette)
41 {
42     int x, y, v;
43     FILE *f;
44     char fname[40], fname2[40];
45     char command[1024];
46
47     snprintf(fname, 40, "%s.ppm", filename);
48
49     f = fopen(fname, "w");
50     if (!f) {
51         perror(fname);
52         exit(1);
53     }
54     fprintf(f, "P6\n"
55             "%d %d\n"
56             "%d\n",
57             w, h, 255);
58     for(y = 0; y < h; y++) {
59         for(x = 0; x < w; x++) {
60             v = rgba_palette[bitmap[y * w + x]];
61             putc((v >> 16) & 0xff, f);
62             putc((v >> 8) & 0xff, f);
63             putc((v >> 0) & 0xff, f);
64         }
65     }
66     fclose(f);
67
68
69     snprintf(fname2, 40, "%s-a.pgm", filename);
70
71     f = fopen(fname2, "w");
72     if (!f) {
73         perror(fname2);
74         exit(1);
75     }
76     fprintf(f, "P5\n"
77             "%d %d\n"
78             "%d\n",
79             w, h, 255);
80     for(y = 0; y < h; y++) {
81         for(x = 0; x < w; x++) {
82             v = rgba_palette[bitmap[y * w + x]];
83             putc((v >> 24) & 0xff, f);
84         }
85     }
86     fclose(f);
87
88     snprintf(command, 1024, "pnmtopng -alpha %s %s > %s.png 2> /dev/null", fname2, fname, filename);
89     system(command);
90
91     snprintf(command, 1024, "rm %s %s", fname, fname2);
92     system(command);
93 }
94 #endif
95
96 static void png_save2(const char *filename, uint32_t *bitmap, int w, int h)
97 {
98     int x, y, v;
99     FILE *f;
100     char fname[40], fname2[40];
101     char command[1024];
102
103     snprintf(fname, sizeof(fname), "%s.ppm", filename);
104
105     f = fopen(fname, "w");
106     if (!f) {
107         perror(fname);
108         exit(1);
109     }
110     fprintf(f, "P6\n"
111             "%d %d\n"
112             "%d\n",
113             w, h, 255);
114     for(y = 0; y < h; y++) {
115         for(x = 0; x < w; x++) {
116             v = bitmap[y * w + x];
117             putc((v >> 16) & 0xff, f);
118             putc((v >> 8) & 0xff, f);
119             putc((v >> 0) & 0xff, f);
120         }
121     }
122     fclose(f);
123
124
125     snprintf(fname2, sizeof(fname2), "%s-a.pgm", filename);
126
127     f = fopen(fname2, "w");
128     if (!f) {
129         perror(fname2);
130         exit(1);
131     }
132     fprintf(f, "P5\n"
133             "%d %d\n"
134             "%d\n",
135             w, h, 255);
136     for(y = 0; y < h; y++) {
137         for(x = 0; x < w; x++) {
138             v = bitmap[y * w + x];
139             putc((v >> 24) & 0xff, f);
140         }
141     }
142     fclose(f);
143
144     snprintf(command, sizeof(command), "pnmtopng -alpha %s %s > %s.png 2> /dev/null", fname2, fname, filename);
145     system(command);
146
147     snprintf(command, sizeof(command), "rm %s %s", fname, fname2);
148     system(command);
149 }
150 #endif
151
152 #define RGBA(r,g,b,a) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
153
154 typedef struct DVBSubCLUT {
155     int id;
156
157     uint32_t clut4[4];
158     uint32_t clut16[16];
159     uint32_t clut256[256];
160
161     struct DVBSubCLUT *next;
162 } DVBSubCLUT;
163
164 static DVBSubCLUT default_clut;
165
166 typedef struct DVBSubObjectDisplay {
167     int object_id;
168     int region_id;
169
170     int x_pos;
171     int y_pos;
172
173     int fgcolor;
174     int bgcolor;
175
176     struct DVBSubObjectDisplay *region_list_next;
177     struct DVBSubObjectDisplay *object_list_next;
178 } DVBSubObjectDisplay;
179
180 typedef struct DVBSubObject {
181     int id;
182
183     int type;
184
185     DVBSubObjectDisplay *display_list;
186
187     struct DVBSubObject *next;
188 } DVBSubObject;
189
190 typedef struct DVBSubRegionDisplay {
191     int region_id;
192
193     int x_pos;
194     int y_pos;
195
196     struct DVBSubRegionDisplay *next;
197 } DVBSubRegionDisplay;
198
199 typedef struct DVBSubRegion {
200     int id;
201
202     int width;
203     int height;
204     int depth;
205
206     int clut;
207     int bgcolor;
208
209     uint8_t *pbuf;
210     int buf_size;
211
212     DVBSubObjectDisplay *display_list;
213
214     struct DVBSubRegion *next;
215 } DVBSubRegion;
216
217 typedef struct DVBSubDisplayDefinition {
218     int version;
219
220     int x;
221     int y;
222     int width;
223     int height;
224 } DVBSubDisplayDefinition;
225
226 typedef struct DVBSubContext {
227     int composition_id;
228     int ancillary_id;
229
230     int time_out;
231     DVBSubRegion *region_list;
232     DVBSubCLUT   *clut_list;
233     DVBSubObject *object_list;
234
235     int display_list_size;
236     DVBSubRegionDisplay *display_list;
237     DVBSubDisplayDefinition *display_definition;
238 } DVBSubContext;
239
240
241 static DVBSubObject* get_object(DVBSubContext *ctx, int object_id)
242 {
243     DVBSubObject *ptr = ctx->object_list;
244
245     while (ptr && ptr->id != object_id) {
246         ptr = ptr->next;
247     }
248
249     return ptr;
250 }
251
252 static DVBSubCLUT* get_clut(DVBSubContext *ctx, int clut_id)
253 {
254     DVBSubCLUT *ptr = ctx->clut_list;
255
256     while (ptr && ptr->id != clut_id) {
257         ptr = ptr->next;
258     }
259
260     return ptr;
261 }
262
263 static DVBSubRegion* get_region(DVBSubContext *ctx, int region_id)
264 {
265     DVBSubRegion *ptr = ctx->region_list;
266
267     while (ptr && ptr->id != region_id) {
268         ptr = ptr->next;
269     }
270
271     return ptr;
272 }
273
274 static void delete_region_display_list(DVBSubContext *ctx, DVBSubRegion *region)
275 {
276     DVBSubObject *object, *obj2, **obj2_ptr;
277     DVBSubObjectDisplay *display, *obj_disp, **obj_disp_ptr;
278
279     while (region->display_list) {
280         display = region->display_list;
281
282         object = get_object(ctx, display->object_id);
283
284         if (object) {
285             obj_disp_ptr = &object->display_list;
286             obj_disp = *obj_disp_ptr;
287
288             while (obj_disp && obj_disp != display) {
289                 obj_disp_ptr = &obj_disp->object_list_next;
290                 obj_disp = *obj_disp_ptr;
291             }
292
293             if (obj_disp) {
294                 *obj_disp_ptr = obj_disp->object_list_next;
295
296                 if (!object->display_list) {
297                     obj2_ptr = &ctx->object_list;
298                     obj2 = *obj2_ptr;
299
300                     while (obj2 != object) {
301                         assert(obj2);
302                         obj2_ptr = &obj2->next;
303                         obj2 = *obj2_ptr;
304                     }
305
306                     *obj2_ptr = obj2->next;
307
308                     av_free(obj2);
309                 }
310             }
311         }
312
313         region->display_list = display->region_list_next;
314
315         av_free(display);
316     }
317
318 }
319
320 static void delete_cluts(DVBSubContext *ctx)
321 {
322     DVBSubCLUT *clut;
323
324     while (ctx->clut_list) {
325         clut = ctx->clut_list;
326
327         ctx->clut_list = clut->next;
328
329         av_free(clut);
330     }
331 }
332
333 static void delete_objects(DVBSubContext *ctx)
334 {
335     DVBSubObject *object;
336
337     while (ctx->object_list) {
338         object = ctx->object_list;
339
340         ctx->object_list = object->next;
341
342         av_free(object);
343     }
344 }
345
346 static void delete_regions(DVBSubContext *ctx)
347 {
348     DVBSubRegion *region;
349
350     while (ctx->region_list) {
351         region = ctx->region_list;
352
353         ctx->region_list = region->next;
354
355         delete_region_display_list(ctx, region);
356
357         av_free(region->pbuf);
358         av_free(region);
359     }
360 }
361
362 static av_cold int dvbsub_init_decoder(AVCodecContext *avctx)
363 {
364     int i, r, g, b, a = 0;
365     DVBSubContext *ctx = avctx->priv_data;
366
367     if (!avctx->extradata || avctx->extradata_size != 4) {
368         av_log(avctx, AV_LOG_WARNING, "Invalid extradata, subtitle streams may be combined!\n");
369         ctx->composition_id = -1;
370         ctx->ancillary_id   = -1;
371     } else {
372         ctx->composition_id = AV_RB16(avctx->extradata);
373         ctx->ancillary_id   = AV_RB16(avctx->extradata + 2);
374     }
375
376     default_clut.id = -1;
377     default_clut.next = NULL;
378
379     default_clut.clut4[0] = RGBA(  0,   0,   0,   0);
380     default_clut.clut4[1] = RGBA(255, 255, 255, 255);
381     default_clut.clut4[2] = RGBA(  0,   0,   0, 255);
382     default_clut.clut4[3] = RGBA(127, 127, 127, 255);
383
384     default_clut.clut16[0] = RGBA(  0,   0,   0,   0);
385     for (i = 1; i < 16; i++) {
386         if (i < 8) {
387             r = (i & 1) ? 255 : 0;
388             g = (i & 2) ? 255 : 0;
389             b = (i & 4) ? 255 : 0;
390         } else {
391             r = (i & 1) ? 127 : 0;
392             g = (i & 2) ? 127 : 0;
393             b = (i & 4) ? 127 : 0;
394         }
395         default_clut.clut16[i] = RGBA(r, g, b, 255);
396     }
397
398     default_clut.clut256[0] = RGBA(  0,   0,   0,   0);
399     for (i = 1; i < 256; i++) {
400         if (i < 8) {
401             r = (i & 1) ? 255 : 0;
402             g = (i & 2) ? 255 : 0;
403             b = (i & 4) ? 255 : 0;
404             a = 63;
405         } else {
406             switch (i & 0x88) {
407             case 0x00:
408                 r = ((i & 1) ? 85 : 0) + ((i & 0x10) ? 170 : 0);
409                 g = ((i & 2) ? 85 : 0) + ((i & 0x20) ? 170 : 0);
410                 b = ((i & 4) ? 85 : 0) + ((i & 0x40) ? 170 : 0);
411                 a = 255;
412                 break;
413             case 0x08:
414                 r = ((i & 1) ? 85 : 0) + ((i & 0x10) ? 170 : 0);
415                 g = ((i & 2) ? 85 : 0) + ((i & 0x20) ? 170 : 0);
416                 b = ((i & 4) ? 85 : 0) + ((i & 0x40) ? 170 : 0);
417                 a = 127;
418                 break;
419             case 0x80:
420                 r = 127 + ((i & 1) ? 43 : 0) + ((i & 0x10) ? 85 : 0);
421                 g = 127 + ((i & 2) ? 43 : 0) + ((i & 0x20) ? 85 : 0);
422                 b = 127 + ((i & 4) ? 43 : 0) + ((i & 0x40) ? 85 : 0);
423                 a = 255;
424                 break;
425             case 0x88:
426                 r = ((i & 1) ? 43 : 0) + ((i & 0x10) ? 85 : 0);
427                 g = ((i & 2) ? 43 : 0) + ((i & 0x20) ? 85 : 0);
428                 b = ((i & 4) ? 43 : 0) + ((i & 0x40) ? 85 : 0);
429                 a = 255;
430                 break;
431             }
432         }
433         default_clut.clut256[i] = RGBA(r, g, b, a);
434     }
435
436     return 0;
437 }
438
439 static av_cold int dvbsub_close_decoder(AVCodecContext *avctx)
440 {
441     DVBSubContext *ctx = avctx->priv_data;
442     DVBSubRegionDisplay *display;
443
444     delete_regions(ctx);
445
446     delete_objects(ctx);
447
448     delete_cluts(ctx);
449
450     av_freep(&ctx->display_definition);
451
452     while (ctx->display_list) {
453         display = ctx->display_list;
454         ctx->display_list = display->next;
455
456         av_free(display);
457     }
458
459     return 0;
460 }
461
462 static int dvbsub_read_2bit_string(uint8_t *destbuf, int dbuf_len,
463                                    const uint8_t **srcbuf, int buf_size,
464                                    int non_mod, uint8_t *map_table)
465 {
466     GetBitContext gb;
467
468     int bits;
469     int run_length;
470     int pixels_read = 0;
471
472     init_get_bits(&gb, *srcbuf, buf_size << 3);
473
474     while (get_bits_count(&gb) < buf_size << 3 && pixels_read < dbuf_len) {
475         bits = get_bits(&gb, 2);
476
477         if (bits) {
478             if (non_mod != 1 || bits != 1) {
479                 if (map_table)
480                     *destbuf++ = map_table[bits];
481                 else
482                     *destbuf++ = bits;
483             }
484             pixels_read++;
485         } else {
486             bits = get_bits1(&gb);
487             if (bits == 1) {
488                 run_length = get_bits(&gb, 3) + 3;
489                 bits = get_bits(&gb, 2);
490
491                 if (non_mod == 1 && bits == 1)
492                     pixels_read += run_length;
493                 else {
494                     if (map_table)
495                         bits = map_table[bits];
496                     while (run_length-- > 0 && pixels_read < dbuf_len) {
497                         *destbuf++ = bits;
498                         pixels_read++;
499                     }
500                 }
501             } else {
502                 bits = get_bits1(&gb);
503                 if (bits == 0) {
504                     bits = get_bits(&gb, 2);
505                     if (bits == 2) {
506                         run_length = get_bits(&gb, 4) + 12;
507                         bits = get_bits(&gb, 2);
508
509                         if (non_mod == 1 && bits == 1)
510                             pixels_read += run_length;
511                         else {
512                             if (map_table)
513                                 bits = map_table[bits];
514                             while (run_length-- > 0 && pixels_read < dbuf_len) {
515                                 *destbuf++ = bits;
516                                 pixels_read++;
517                             }
518                         }
519                     } else if (bits == 3) {
520                         run_length = get_bits(&gb, 8) + 29;
521                         bits = get_bits(&gb, 2);
522
523                         if (non_mod == 1 && bits == 1)
524                             pixels_read += run_length;
525                         else {
526                             if (map_table)
527                                 bits = map_table[bits];
528                             while (run_length-- > 0 && pixels_read < dbuf_len) {
529                                 *destbuf++ = bits;
530                                 pixels_read++;
531                             }
532                         }
533                     } else if (bits == 1) {
534                         pixels_read += 2;
535                         if (map_table)
536                             bits = map_table[0];
537                         else
538                             bits = 0;
539                         if (pixels_read <= dbuf_len) {
540                             *destbuf++ = bits;
541                             *destbuf++ = bits;
542                         }
543                     } else {
544                         (*srcbuf) += (get_bits_count(&gb) + 7) >> 3;
545                         return pixels_read;
546                     }
547                 } else {
548                     if (map_table)
549                         bits = map_table[0];
550                     else
551                         bits = 0;
552                     *destbuf++ = bits;
553                     pixels_read++;
554                 }
555             }
556         }
557     }
558
559     if (get_bits(&gb, 6))
560         av_log(0, AV_LOG_ERROR, "DVBSub error: line overflow\n");
561
562     (*srcbuf) += (get_bits_count(&gb) + 7) >> 3;
563
564     return pixels_read;
565 }
566
567 static int dvbsub_read_4bit_string(uint8_t *destbuf, int dbuf_len,
568                                    const uint8_t **srcbuf, int buf_size,
569                                    int non_mod, uint8_t *map_table)
570 {
571     GetBitContext gb;
572
573     int bits;
574     int run_length;
575     int pixels_read = 0;
576
577     init_get_bits(&gb, *srcbuf, buf_size << 3);
578
579     while (get_bits_count(&gb) < buf_size << 3 && pixels_read < dbuf_len) {
580         bits = get_bits(&gb, 4);
581
582         if (bits) {
583             if (non_mod != 1 || bits != 1) {
584                 if (map_table)
585                     *destbuf++ = map_table[bits];
586                 else
587                     *destbuf++ = bits;
588             }
589             pixels_read++;
590         } else {
591             bits = get_bits1(&gb);
592             if (bits == 0) {
593                 run_length = get_bits(&gb, 3);
594
595                 if (run_length == 0) {
596                     (*srcbuf) += (get_bits_count(&gb) + 7) >> 3;
597                     return pixels_read;
598                 }
599
600                 run_length += 2;
601
602                 if (map_table)
603                     bits = map_table[0];
604                 else
605                     bits = 0;
606
607                 while (run_length-- > 0 && pixels_read < dbuf_len) {
608                     *destbuf++ = bits;
609                     pixels_read++;
610                 }
611             } else {
612                 bits = get_bits1(&gb);
613                 if (bits == 0) {
614                     run_length = get_bits(&gb, 2) + 4;
615                     bits = get_bits(&gb, 4);
616
617                     if (non_mod == 1 && bits == 1)
618                         pixels_read += run_length;
619                     else {
620                         if (map_table)
621                             bits = map_table[bits];
622                         while (run_length-- > 0 && pixels_read < dbuf_len) {
623                             *destbuf++ = bits;
624                             pixels_read++;
625                         }
626                     }
627                 } else {
628                     bits = get_bits(&gb, 2);
629                     if (bits == 2) {
630                         run_length = get_bits(&gb, 4) + 9;
631                         bits = get_bits(&gb, 4);
632
633                         if (non_mod == 1 && bits == 1)
634                             pixels_read += run_length;
635                         else {
636                             if (map_table)
637                                 bits = map_table[bits];
638                             while (run_length-- > 0 && pixels_read < dbuf_len) {
639                                 *destbuf++ = bits;
640                                 pixels_read++;
641                             }
642                         }
643                     } else if (bits == 3) {
644                         run_length = get_bits(&gb, 8) + 25;
645                         bits = get_bits(&gb, 4);
646
647                         if (non_mod == 1 && bits == 1)
648                             pixels_read += run_length;
649                         else {
650                             if (map_table)
651                                 bits = map_table[bits];
652                             while (run_length-- > 0 && pixels_read < dbuf_len) {
653                                 *destbuf++ = bits;
654                                 pixels_read++;
655                             }
656                         }
657                     } else if (bits == 1) {
658                         pixels_read += 2;
659                         if (map_table)
660                             bits = map_table[0];
661                         else
662                             bits = 0;
663                         if (pixels_read <= dbuf_len) {
664                             *destbuf++ = bits;
665                             *destbuf++ = bits;
666                         }
667                     } else {
668                         if (map_table)
669                             bits = map_table[0];
670                         else
671                             bits = 0;
672                         *destbuf++ = bits;
673                         pixels_read ++;
674                     }
675                 }
676             }
677         }
678     }
679
680     if (get_bits(&gb, 8))
681         av_log(0, AV_LOG_ERROR, "DVBSub error: line overflow\n");
682
683     (*srcbuf) += (get_bits_count(&gb) + 7) >> 3;
684
685     return pixels_read;
686 }
687
688 static int dvbsub_read_8bit_string(uint8_t *destbuf, int dbuf_len,
689                                     const uint8_t **srcbuf, int buf_size,
690                                     int non_mod, uint8_t *map_table)
691 {
692     const uint8_t *sbuf_end = (*srcbuf) + buf_size;
693     int bits;
694     int run_length;
695     int pixels_read = 0;
696
697     while (*srcbuf < sbuf_end && pixels_read < dbuf_len) {
698         bits = *(*srcbuf)++;
699
700         if (bits) {
701             if (non_mod != 1 || bits != 1) {
702                 if (map_table)
703                     *destbuf++ = map_table[bits];
704                 else
705                     *destbuf++ = bits;
706             }
707             pixels_read++;
708         } else {
709             bits = *(*srcbuf)++;
710             run_length = bits & 0x7f;
711             if ((bits & 0x80) == 0) {
712                 if (run_length == 0) {
713                     return pixels_read;
714                 }
715
716                 if (map_table)
717                     bits = map_table[0];
718                 else
719                     bits = 0;
720                 while (run_length-- > 0 && pixels_read < dbuf_len) {
721                     *destbuf++ = bits;
722                     pixels_read++;
723                 }
724             } else {
725                 bits = *(*srcbuf)++;
726
727                 if (non_mod == 1 && bits == 1)
728                     pixels_read += run_length;
729                 if (map_table)
730                     bits = map_table[bits];
731                 else while (run_length-- > 0 && pixels_read < dbuf_len) {
732                     *destbuf++ = bits;
733                     pixels_read++;
734                 }
735             }
736         }
737     }
738
739     if (*(*srcbuf)++)
740         av_log(0, AV_LOG_ERROR, "DVBSub error: line overflow\n");
741
742     return pixels_read;
743 }
744
745
746
747 static void dvbsub_parse_pixel_data_block(AVCodecContext *avctx, DVBSubObjectDisplay *display,
748                                           const uint8_t *buf, int buf_size, int top_bottom, int non_mod)
749 {
750     DVBSubContext *ctx = avctx->priv_data;
751
752     DVBSubRegion *region = get_region(ctx, display->region_id);
753     const uint8_t *buf_end = buf + buf_size;
754     uint8_t *pbuf;
755     int x_pos, y_pos;
756     int i;
757
758     uint8_t map2to4[] = { 0x0,  0x7,  0x8,  0xf};
759     uint8_t map2to8[] = {0x00, 0x77, 0x88, 0xff};
760     uint8_t map4to8[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
761                          0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
762     uint8_t *map_table;
763
764     av_dlog(avctx, "DVB pixel block size %d, %s field:\n", buf_size,
765             top_bottom ? "bottom" : "top");
766
767     for (i = 0; i < buf_size; i++) {
768         if (i % 16 == 0)
769             av_dlog(avctx, "0x%8p: ", buf+i);
770
771         av_dlog(avctx, "%02x ", buf[i]);
772         if (i % 16 == 15)
773             av_dlog(avctx, "\n");
774     }
775
776     if (i % 16)
777         av_dlog(avctx, "\n");
778
779     if (region == 0)
780         return;
781
782     pbuf = region->pbuf;
783
784     x_pos = display->x_pos;
785     y_pos = display->y_pos;
786
787     if ((y_pos & 1) != top_bottom)
788         y_pos++;
789
790     while (buf < buf_end) {
791         if (x_pos > region->width || y_pos > region->height) {
792             av_log(avctx, AV_LOG_ERROR, "Invalid object location!\n");
793             return;
794         }
795
796         switch (*buf++) {
797         case 0x10:
798             if (region->depth == 8)
799                 map_table = map2to8;
800             else if (region->depth == 4)
801                 map_table = map2to4;
802             else
803                 map_table = NULL;
804
805             x_pos += dvbsub_read_2bit_string(pbuf + (y_pos * region->width) + x_pos,
806                                                 region->width - x_pos, &buf, buf_end - buf,
807                                                 non_mod, map_table);
808             break;
809         case 0x11:
810             if (region->depth < 4) {
811                 av_log(avctx, AV_LOG_ERROR, "4-bit pixel string in %d-bit region!\n", region->depth);
812                 return;
813             }
814
815             if (region->depth == 8)
816                 map_table = map4to8;
817             else
818                 map_table = NULL;
819
820             x_pos += dvbsub_read_4bit_string(pbuf + (y_pos * region->width) + x_pos,
821                                                 region->width - x_pos, &buf, buf_end - buf,
822                                                 non_mod, map_table);
823             break;
824         case 0x12:
825             if (region->depth < 8) {
826                 av_log(avctx, AV_LOG_ERROR, "8-bit pixel string in %d-bit region!\n", region->depth);
827                 return;
828             }
829
830             x_pos += dvbsub_read_8bit_string(pbuf + (y_pos * region->width) + x_pos,
831                                                 region->width - x_pos, &buf, buf_end - buf,
832                                                 non_mod, NULL);
833             break;
834
835         case 0x20:
836             map2to4[0] = (*buf) >> 4;
837             map2to4[1] = (*buf++) & 0xf;
838             map2to4[2] = (*buf) >> 4;
839             map2to4[3] = (*buf++) & 0xf;
840             break;
841         case 0x21:
842             for (i = 0; i < 4; i++)
843                 map2to8[i] = *buf++;
844             break;
845         case 0x22:
846             for (i = 0; i < 16; i++)
847                 map4to8[i] = *buf++;
848             break;
849
850         case 0xf0:
851             x_pos = display->x_pos;
852             y_pos += 2;
853             break;
854         default:
855             av_log(avctx, AV_LOG_INFO, "Unknown/unsupported pixel block 0x%x\n", *(buf-1));
856         }
857     }
858
859 }
860
861 static void dvbsub_parse_object_segment(AVCodecContext *avctx,
862                                         const uint8_t *buf, int buf_size)
863 {
864     DVBSubContext *ctx = avctx->priv_data;
865
866     const uint8_t *buf_end = buf + buf_size;
867     const uint8_t *block;
868     int object_id;
869     DVBSubObject *object;
870     DVBSubObjectDisplay *display;
871     int top_field_len, bottom_field_len;
872
873     int coding_method, non_modifying_color;
874
875     object_id = AV_RB16(buf);
876     buf += 2;
877
878     object = get_object(ctx, object_id);
879
880     if (!object)
881         return;
882
883     coding_method = ((*buf) >> 2) & 3;
884     non_modifying_color = ((*buf++) >> 1) & 1;
885
886     if (coding_method == 0) {
887         top_field_len = AV_RB16(buf);
888         buf += 2;
889         bottom_field_len = AV_RB16(buf);
890         buf += 2;
891
892         if (buf + top_field_len + bottom_field_len > buf_end) {
893             av_log(avctx, AV_LOG_ERROR, "Field data size too large\n");
894             return;
895         }
896
897         for (display = object->display_list; display; display = display->object_list_next) {
898             block = buf;
899
900             dvbsub_parse_pixel_data_block(avctx, display, block, top_field_len, 0,
901                                             non_modifying_color);
902
903             if (bottom_field_len > 0)
904                 block = buf + top_field_len;
905             else
906                 bottom_field_len = top_field_len;
907
908             dvbsub_parse_pixel_data_block(avctx, display, block, bottom_field_len, 1,
909                                             non_modifying_color);
910         }
911
912 /*  } else if (coding_method == 1) {*/
913
914     } else {
915         av_log(avctx, AV_LOG_ERROR, "Unknown object coding %d\n", coding_method);
916     }
917
918 }
919
920 static void dvbsub_parse_clut_segment(AVCodecContext *avctx,
921                                         const uint8_t *buf, int buf_size)
922 {
923     DVBSubContext *ctx = avctx->priv_data;
924
925     const uint8_t *buf_end = buf + buf_size;
926     int i, clut_id;
927     DVBSubCLUT *clut;
928     int entry_id, depth , full_range;
929     int y, cr, cb, alpha;
930     int r, g, b, r_add, g_add, b_add;
931
932     av_dlog(avctx, "DVB clut packet:\n");
933
934     for (i=0; i < buf_size; i++) {
935         av_dlog(avctx, "%02x ", buf[i]);
936         if (i % 16 == 15)
937             av_dlog(avctx, "\n");
938     }
939
940     if (i % 16)
941         av_dlog(avctx, "\n");
942
943     clut_id = *buf++;
944     buf += 1;
945
946     clut = get_clut(ctx, clut_id);
947
948     if (!clut) {
949         clut = av_malloc(sizeof(DVBSubCLUT));
950
951         memcpy(clut, &default_clut, sizeof(DVBSubCLUT));
952
953         clut->id = clut_id;
954
955         clut->next = ctx->clut_list;
956         ctx->clut_list = clut;
957     }
958
959     while (buf + 4 < buf_end) {
960         entry_id = *buf++;
961
962         depth = (*buf) & 0xe0;
963
964         if (depth == 0) {
965             av_log(avctx, AV_LOG_ERROR, "Invalid clut depth 0x%x!\n", *buf);
966             return;
967         }
968
969         full_range = (*buf++) & 1;
970
971         if (full_range) {
972             y = *buf++;
973             cr = *buf++;
974             cb = *buf++;
975             alpha = *buf++;
976         } else {
977             y = buf[0] & 0xfc;
978             cr = (((buf[0] & 3) << 2) | ((buf[1] >> 6) & 3)) << 4;
979             cb = (buf[1] << 2) & 0xf0;
980             alpha = (buf[1] << 6) & 0xc0;
981
982             buf += 2;
983         }
984
985         if (y == 0)
986             alpha = 0xff;
987
988         YUV_TO_RGB1_CCIR(cb, cr);
989         YUV_TO_RGB2_CCIR(r, g, b, y);
990
991         av_dlog(avctx, "clut %d := (%d,%d,%d,%d)\n", entry_id, r, g, b, alpha);
992
993         if (depth & 0x80)
994             clut->clut4[entry_id] = RGBA(r,g,b,255 - alpha);
995         if (depth & 0x40)
996             clut->clut16[entry_id] = RGBA(r,g,b,255 - alpha);
997         if (depth & 0x20)
998             clut->clut256[entry_id] = RGBA(r,g,b,255 - alpha);
999     }
1000 }
1001
1002
1003 static void dvbsub_parse_region_segment(AVCodecContext *avctx,
1004                                         const uint8_t *buf, int buf_size)
1005 {
1006     DVBSubContext *ctx = avctx->priv_data;
1007
1008     const uint8_t *buf_end = buf + buf_size;
1009     int region_id, object_id;
1010     DVBSubRegion *region;
1011     DVBSubObject *object;
1012     DVBSubObjectDisplay *display;
1013     int fill;
1014
1015     if (buf_size < 10)
1016         return;
1017
1018     region_id = *buf++;
1019
1020     region = get_region(ctx, region_id);
1021
1022     if (!region) {
1023         region = av_mallocz(sizeof(DVBSubRegion));
1024
1025         region->id = region_id;
1026
1027         region->next = ctx->region_list;
1028         ctx->region_list = region;
1029     }
1030
1031     fill = ((*buf++) >> 3) & 1;
1032
1033     region->width = AV_RB16(buf);
1034     buf += 2;
1035     region->height = AV_RB16(buf);
1036     buf += 2;
1037
1038     if (region->width * region->height != region->buf_size) {
1039         av_free(region->pbuf);
1040
1041         region->buf_size = region->width * region->height;
1042
1043         region->pbuf = av_malloc(region->buf_size);
1044
1045         fill = 1;
1046     }
1047
1048     region->depth = 1 << (((*buf++) >> 2) & 7);
1049     if(region->depth<2 || region->depth>8){
1050         av_log(avctx, AV_LOG_ERROR, "region depth %d is invalid\n", region->depth);
1051         region->depth= 4;
1052     }
1053     region->clut = *buf++;
1054
1055     if (region->depth == 8)
1056         region->bgcolor = *buf++;
1057     else {
1058         buf += 1;
1059
1060         if (region->depth == 4)
1061             region->bgcolor = (((*buf++) >> 4) & 15);
1062         else
1063             region->bgcolor = (((*buf++) >> 2) & 3);
1064     }
1065
1066     av_dlog(avctx, "Region %d, (%dx%d)\n", region_id, region->width, region->height);
1067
1068     if (fill) {
1069         memset(region->pbuf, region->bgcolor, region->buf_size);
1070         av_dlog(avctx, "Fill region (%d)\n", region->bgcolor);
1071     }
1072
1073     delete_region_display_list(ctx, region);
1074
1075     while (buf + 5 < buf_end) {
1076         object_id = AV_RB16(buf);
1077         buf += 2;
1078
1079         object = get_object(ctx, object_id);
1080
1081         if (!object) {
1082             object = av_mallocz(sizeof(DVBSubObject));
1083
1084             object->id = object_id;
1085             object->next = ctx->object_list;
1086             ctx->object_list = object;
1087         }
1088
1089         object->type = (*buf) >> 6;
1090
1091         display = av_mallocz(sizeof(DVBSubObjectDisplay));
1092
1093         display->object_id = object_id;
1094         display->region_id = region_id;
1095
1096         display->x_pos = AV_RB16(buf) & 0xfff;
1097         buf += 2;
1098         display->y_pos = AV_RB16(buf) & 0xfff;
1099         buf += 2;
1100
1101         if ((object->type == 1 || object->type == 2) && buf+1 < buf_end) {
1102             display->fgcolor = *buf++;
1103             display->bgcolor = *buf++;
1104         }
1105
1106         display->region_list_next = region->display_list;
1107         region->display_list = display;
1108
1109         display->object_list_next = object->display_list;
1110         object->display_list = display;
1111     }
1112 }
1113
1114 static void dvbsub_parse_page_segment(AVCodecContext *avctx,
1115                                         const uint8_t *buf, int buf_size)
1116 {
1117     DVBSubContext *ctx = avctx->priv_data;
1118     DVBSubRegionDisplay *display;
1119     DVBSubRegionDisplay *tmp_display_list, **tmp_ptr;
1120
1121     const uint8_t *buf_end = buf + buf_size;
1122     int region_id;
1123     int page_state;
1124
1125     if (buf_size < 1)
1126         return;
1127
1128     ctx->time_out = *buf++;
1129     page_state = ((*buf++) >> 2) & 3;
1130
1131     av_dlog(avctx, "Page time out %ds, state %d\n", ctx->time_out, page_state);
1132
1133     if (page_state == 2) {
1134         delete_regions(ctx);
1135         delete_objects(ctx);
1136         delete_cluts(ctx);
1137     }
1138
1139     tmp_display_list = ctx->display_list;
1140     ctx->display_list = NULL;
1141     ctx->display_list_size = 0;
1142
1143     while (buf + 5 < buf_end) {
1144         region_id = *buf++;
1145         buf += 1;
1146
1147         display = tmp_display_list;
1148         tmp_ptr = &tmp_display_list;
1149
1150         while (display && display->region_id != region_id) {
1151             tmp_ptr = &display->next;
1152             display = display->next;
1153         }
1154
1155         if (!display)
1156             display = av_mallocz(sizeof(DVBSubRegionDisplay));
1157
1158         display->region_id = region_id;
1159
1160         display->x_pos = AV_RB16(buf);
1161         buf += 2;
1162         display->y_pos = AV_RB16(buf);
1163         buf += 2;
1164
1165         *tmp_ptr = display->next;
1166
1167         display->next = ctx->display_list;
1168         ctx->display_list = display;
1169         ctx->display_list_size++;
1170
1171         av_dlog(avctx, "Region %d, (%d,%d)\n", region_id, display->x_pos, display->y_pos);
1172     }
1173
1174     while (tmp_display_list) {
1175         display = tmp_display_list;
1176
1177         tmp_display_list = display->next;
1178
1179         av_free(display);
1180     }
1181
1182 }
1183
1184
1185 #ifdef DEBUG
1186 static void save_display_set(DVBSubContext *ctx)
1187 {
1188     DVBSubRegion *region;
1189     DVBSubRegionDisplay *display;
1190     DVBSubCLUT *clut;
1191     uint32_t *clut_table;
1192     int x_pos, y_pos, width, height;
1193     int x, y, y_off, x_off;
1194     uint32_t *pbuf;
1195     char filename[32];
1196     static int fileno_index = 0;
1197
1198     x_pos = -1;
1199     y_pos = -1;
1200     width = 0;
1201     height = 0;
1202
1203     for (display = ctx->display_list; display; display = display->next) {
1204         region = get_region(ctx, display->region_id);
1205
1206         if (x_pos == -1) {
1207             x_pos = display->x_pos;
1208             y_pos = display->y_pos;
1209             width = region->width;
1210             height = region->height;
1211         } else {
1212             if (display->x_pos < x_pos) {
1213                 width += (x_pos - display->x_pos);
1214                 x_pos = display->x_pos;
1215             }
1216
1217             if (display->y_pos < y_pos) {
1218                 height += (y_pos - display->y_pos);
1219                 y_pos = display->y_pos;
1220             }
1221
1222             if (display->x_pos + region->width > x_pos + width) {
1223                 width = display->x_pos + region->width - x_pos;
1224             }
1225
1226             if (display->y_pos + region->height > y_pos + height) {
1227                 height = display->y_pos + region->height - y_pos;
1228             }
1229         }
1230     }
1231
1232     if (x_pos >= 0) {
1233
1234         pbuf = av_malloc(width * height * 4);
1235
1236         for (display = ctx->display_list; display; display = display->next) {
1237             region = get_region(ctx, display->region_id);
1238
1239             x_off = display->x_pos - x_pos;
1240             y_off = display->y_pos - y_pos;
1241
1242             clut = get_clut(ctx, region->clut);
1243
1244             if (clut == 0)
1245                 clut = &default_clut;
1246
1247             switch (region->depth) {
1248             case 2:
1249                 clut_table = clut->clut4;
1250                 break;
1251             case 8:
1252                 clut_table = clut->clut256;
1253                 break;
1254             case 4:
1255             default:
1256                 clut_table = clut->clut16;
1257                 break;
1258             }
1259
1260             for (y = 0; y < region->height; y++) {
1261                 for (x = 0; x < region->width; x++) {
1262                     pbuf[((y + y_off) * width) + x_off + x] =
1263                         clut_table[region->pbuf[y * region->width + x]];
1264                 }
1265             }
1266
1267         }
1268
1269         snprintf(filename, sizeof(filename), "dvbs.%d", fileno_index);
1270
1271         png_save2(filename, pbuf, width, height);
1272
1273         av_free(pbuf);
1274     }
1275
1276     fileno_index++;
1277 }
1278 #endif
1279
1280 static void dvbsub_parse_display_definition_segment(AVCodecContext *avctx,
1281                                                     const uint8_t *buf,
1282                                                     int buf_size)
1283 {
1284     DVBSubContext *ctx = avctx->priv_data;
1285     DVBSubDisplayDefinition *display_def = ctx->display_definition;
1286     int dds_version, info_byte;
1287
1288     if (buf_size < 5)
1289         return;
1290
1291     info_byte   = bytestream_get_byte(&buf);
1292     dds_version = info_byte >> 4;
1293     if (display_def && display_def->version == dds_version)
1294         return; // already have this display definition version
1295
1296     if (!display_def) {
1297         display_def             = av_mallocz(sizeof(*display_def));
1298         ctx->display_definition = display_def;
1299     }
1300     if (!display_def)
1301         return;
1302
1303     display_def->version = dds_version;
1304     display_def->x       = 0;
1305     display_def->y       = 0;
1306     display_def->width   = bytestream_get_be16(&buf) + 1;
1307     display_def->height  = bytestream_get_be16(&buf) + 1;
1308
1309     if (buf_size < 13)
1310         return;
1311
1312     if (info_byte & 1<<3) { // display_window_flag
1313         display_def->x = bytestream_get_be16(&buf);
1314         display_def->y = bytestream_get_be16(&buf);
1315         display_def->width  = bytestream_get_be16(&buf) - display_def->x + 1;
1316         display_def->height = bytestream_get_be16(&buf) - display_def->y + 1;
1317     }
1318 }
1319
1320 static int dvbsub_display_end_segment(AVCodecContext *avctx, const uint8_t *buf,
1321                                         int buf_size, AVSubtitle *sub)
1322 {
1323     DVBSubContext *ctx = avctx->priv_data;
1324     DVBSubDisplayDefinition *display_def = ctx->display_definition;
1325
1326     DVBSubRegion *region;
1327     DVBSubRegionDisplay *display;
1328     AVSubtitleRect *rect;
1329     DVBSubCLUT *clut;
1330     uint32_t *clut_table;
1331     int i;
1332     int offset_x=0, offset_y=0;
1333
1334     sub->end_display_time = ctx->time_out * 1000;
1335
1336     if (display_def) {
1337         offset_x = display_def->x;
1338         offset_y = display_def->y;
1339     }
1340
1341     sub->num_rects = ctx->display_list_size;
1342
1343     if (sub->num_rects > 0){
1344         sub->rects = av_mallocz(sizeof(*sub->rects) * sub->num_rects);
1345         for(i=0; i<sub->num_rects; i++)
1346             sub->rects[i] = av_mallocz(sizeof(*sub->rects[i]));
1347     }
1348
1349     i = 0;
1350
1351     for (display = ctx->display_list; display; display = display->next) {
1352         region = get_region(ctx, display->region_id);
1353         rect = sub->rects[i];
1354
1355         if (!region)
1356             continue;
1357
1358         rect->x = display->x_pos + offset_x;
1359         rect->y = display->y_pos + offset_y;
1360         rect->w = region->width;
1361         rect->h = region->height;
1362         rect->nb_colors = 16;
1363         rect->type      = SUBTITLE_BITMAP;
1364         rect->pict.linesize[0] = region->width;
1365
1366         clut = get_clut(ctx, region->clut);
1367
1368         if (!clut)
1369             clut = &default_clut;
1370
1371         switch (region->depth) {
1372         case 2:
1373             clut_table = clut->clut4;
1374             break;
1375         case 8:
1376             clut_table = clut->clut256;
1377             break;
1378         case 4:
1379         default:
1380             clut_table = clut->clut16;
1381             break;
1382         }
1383
1384         rect->pict.data[1] = av_mallocz(AVPALETTE_SIZE);
1385         memcpy(rect->pict.data[1], clut_table, (1 << region->depth) * sizeof(uint32_t));
1386
1387         rect->pict.data[0] = av_malloc(region->buf_size);
1388         memcpy(rect->pict.data[0], region->pbuf, region->buf_size);
1389
1390         i++;
1391     }
1392
1393     sub->num_rects = i;
1394
1395 #ifdef DEBUG
1396     save_display_set(ctx);
1397 #endif
1398
1399     return 1;
1400 }
1401
1402 static int dvbsub_decode(AVCodecContext *avctx,
1403                          void *data, int *data_size,
1404                          AVPacket *avpkt)
1405 {
1406     const uint8_t *buf = avpkt->data;
1407     int buf_size = avpkt->size;
1408     DVBSubContext *ctx = avctx->priv_data;
1409     AVSubtitle *sub = data;
1410     const uint8_t *p, *p_end;
1411     int segment_type;
1412     int page_id;
1413     int segment_length;
1414     int i;
1415
1416     av_dlog(avctx, "DVB sub packet:\n");
1417
1418     for (i=0; i < buf_size; i++) {
1419         av_dlog(avctx, "%02x ", buf[i]);
1420         if (i % 16 == 15)
1421             av_dlog(avctx, "\n");
1422     }
1423
1424     if (i % 16)
1425         av_dlog(avctx, "\n");
1426
1427     if (buf_size <= 6 || *buf != 0x0f) {
1428         av_dlog(avctx, "incomplete or broken packet");
1429         return -1;
1430     }
1431
1432     p = buf;
1433     p_end = buf + buf_size;
1434
1435     while (p_end - p >= 6 && *p == 0x0f) {
1436         p += 1;
1437         segment_type = *p++;
1438         page_id = AV_RB16(p);
1439         p += 2;
1440         segment_length = AV_RB16(p);
1441         p += 2;
1442
1443         if (p_end - p < segment_length) {
1444             av_dlog(avctx, "incomplete or broken packet");
1445             return -1;
1446         }
1447
1448         if (page_id == ctx->composition_id || page_id == ctx->ancillary_id ||
1449             ctx->composition_id == -1 || ctx->ancillary_id == -1) {
1450             switch (segment_type) {
1451             case DVBSUB_PAGE_SEGMENT:
1452                 dvbsub_parse_page_segment(avctx, p, segment_length);
1453                 break;
1454             case DVBSUB_REGION_SEGMENT:
1455                 dvbsub_parse_region_segment(avctx, p, segment_length);
1456                 break;
1457             case DVBSUB_CLUT_SEGMENT:
1458                 dvbsub_parse_clut_segment(avctx, p, segment_length);
1459                 break;
1460             case DVBSUB_OBJECT_SEGMENT:
1461                 dvbsub_parse_object_segment(avctx, p, segment_length);
1462                 break;
1463             case DVBSUB_DISPLAYDEFINITION_SEGMENT:
1464                 dvbsub_parse_display_definition_segment(avctx, p, segment_length);
1465             case DVBSUB_DISPLAY_SEGMENT:
1466                 *data_size = dvbsub_display_end_segment(avctx, p, segment_length, sub);
1467                 break;
1468             default:
1469                 av_dlog(avctx, "Subtitling segment type 0x%x, page id %d, length %d\n",
1470                         segment_type, page_id, segment_length);
1471                 break;
1472             }
1473         }
1474
1475         p += segment_length;
1476     }
1477
1478     return p - buf;
1479 }
1480
1481
1482 AVCodec ff_dvbsub_decoder = {
1483     "dvbsub",
1484     AVMEDIA_TYPE_SUBTITLE,
1485     CODEC_ID_DVB_SUBTITLE,
1486     sizeof(DVBSubContext),
1487     dvbsub_init_decoder,
1488     NULL,
1489     dvbsub_close_decoder,
1490     dvbsub_decode,
1491     .long_name = NULL_IF_CONFIG_SMALL("DVB subtitles"),
1492 };