codec: don't drop blocks marked BLOCK_FLAG_DISCONTINUITY
[vlc.git] / modules / codec / cvdsub.c
1 /*****************************************************************************
2  * cvdsub.c : CVD Subtitle decoder
3  *****************************************************************************
4  * Copyright (C) 2003, 2004 VLC authors and VideoLAN
5  * $Id$
6  *
7  * Authors: Rocky Bernstein
8  *          Gildas Bazin <gbazin@videolan.org>
9  *          Julio Sanchez Fernandez (http://subhandler.sourceforge.net)
10  *          Laurent Aimar <fenrir@via.ecp.fr>
11  *
12  * This program is free software; you can redistribute it and/or modify it
13  * under the terms of the GNU Lesser General Public License as published by
14  * the Free Software Foundation; either version 2.1 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public License
23  * along with this program; if not, write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25  *****************************************************************************/
26
27 /*****************************************************************************
28  * Preamble
29  *****************************************************************************/
30 #ifdef HAVE_CONFIG_H
31 # include "config.h"
32 #endif
33
34 #include <vlc_common.h>
35 #include <vlc_plugin.h>
36 #include <vlc_codec.h>
37
38 #include <vlc_bits.h>
39
40 #define DEBUG_CVDSUB 1
41
42 /*****************************************************************************
43  * Module descriptor.
44  *****************************************************************************/
45 static int  DecoderOpen   ( vlc_object_t * );
46 static int  PacketizerOpen( vlc_object_t * );
47 static void DecoderClose  ( vlc_object_t * );
48
49 vlc_module_begin ()
50     set_description( N_("CVD subtitle decoder") )
51     set_capability( "decoder", 50 )
52     set_callbacks( DecoderOpen, DecoderClose )
53
54     add_submodule ()
55     set_description( N_("Chaoji VCD subtitle packetizer") )
56     set_capability( "packetizer", 50 )
57     set_callbacks( PacketizerOpen, DecoderClose )
58 vlc_module_end ()
59
60 /*****************************************************************************
61  * Local prototypes
62  *****************************************************************************/
63 static subpicture_t *Decode( decoder_t *, block_t ** );
64 static block_t *Packetize  ( decoder_t *, block_t ** );
65 static block_t *Reassemble ( decoder_t *, block_t * );
66 static void ParseMetaInfo  ( decoder_t *, block_t * );
67 static void ParseHeader    ( decoder_t *, block_t * );
68 static subpicture_t *DecodePacket( decoder_t *, block_t * );
69 static void RenderImage( decoder_t *, block_t *, subpicture_region_t * );
70
71 #define SUBTITLE_BLOCK_EMPTY 0
72 #define SUBTITLE_BLOCK_PARTIAL 1
73 #define SUBTITLE_BLOCK_COMPLETE 2
74
75 struct decoder_sys_t
76 {
77   int      b_packetizer;
78
79   int      i_state;    /* data-gathering state for this subtitle */
80
81   block_t  *p_spu;   /* Bytes of the packet. */
82
83   size_t   i_spu_size;     /* goal for subtitle_data_pos while gathering,
84                              size of used subtitle_data later */
85
86   uint16_t i_image_offset;      /* offset from subtitle_data to compressed
87                                    image data */
88   size_t i_image_length;           /* size of the compressed image data */
89   size_t first_field_offset;       /* offset of even raster lines */
90   size_t second_field_offset;      /* offset of odd raster lines */
91   size_t metadata_offset;          /* offset to data describing the image */
92   size_t metadata_length;          /* length of metadata */
93
94   mtime_t i_duration;   /* how long to display the image, 0 stands
95                            for "until next subtitle" */
96
97   uint16_t i_x_start, i_y_start; /* position of top leftmost pixel of
98                                     image when displayed */
99   uint16_t i_width, i_height;    /* dimensions in pixels of image */
100
101   uint8_t p_palette[4][4];       /* Palette of colors used in subtitle */
102   uint8_t p_palette_highlight[4][4];
103 };
104
105 /*****************************************************************************
106  * DecoderOpen: open/initialize the cvdsub decoder.
107  *****************************************************************************/
108 static int DecoderOpen( vlc_object_t *p_this )
109 {
110     decoder_t     *p_dec = (decoder_t*)p_this;
111     decoder_sys_t *p_sys;
112
113     if( p_dec->fmt_in.i_codec != VLC_CODEC_CVD )
114         return VLC_EGENERIC;
115
116     p_dec->p_sys = p_sys = malloc( sizeof( decoder_sys_t ) );
117     if( !p_sys )
118         return VLC_ENOMEM;
119
120     p_sys->b_packetizer  = false;
121
122     p_sys->i_state = SUBTITLE_BLOCK_EMPTY;
123     p_sys->p_spu   = NULL;
124
125     p_dec->pf_decode_sub = Decode;
126     p_dec->pf_packetize  = Packetize;
127
128     p_dec->fmt_out.i_cat = SPU_ES;
129     p_dec->fmt_out.i_codec = VLC_CODEC_YUVP;
130
131     return VLC_SUCCESS;
132 }
133
134 /*****************************************************************************
135  * PacketizerOpen: open/initialize the cvdsub packetizer.
136  *****************************************************************************/
137 static int PacketizerOpen( vlc_object_t *p_this )
138 {
139     decoder_t *p_dec = (decoder_t*)p_this;
140
141     if( DecoderOpen( p_this ) != VLC_SUCCESS ) return VLC_EGENERIC;
142
143     p_dec->p_sys->b_packetizer = true;
144
145     return VLC_SUCCESS;
146 }
147
148 /*****************************************************************************
149  * DecoderClose: closes the cvdsub decoder/packetizer.
150  *****************************************************************************/
151 void DecoderClose( vlc_object_t *p_this )
152 {
153     decoder_t     *p_dec = (decoder_t*)p_this;
154     decoder_sys_t *p_sys = p_dec->p_sys;
155
156     if( p_sys->p_spu ) block_ChainRelease( p_sys->p_spu );
157     free( p_sys );
158 }
159
160 /*****************************************************************************
161  * Decode:
162  *****************************************************************************/
163 static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
164 {
165     block_t *p_block, *p_spu;
166
167     if( pp_block == NULL || *pp_block == NULL ) return NULL;
168
169     p_block = *pp_block;
170     *pp_block = NULL;
171
172     if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
173     {
174         block_Release( p_block );
175         return NULL;
176     }
177
178     if( !(p_spu = Reassemble( p_dec, p_block )) ) return NULL;
179
180     /* Parse and decode */
181     return DecodePacket( p_dec, p_spu );
182 }
183
184 /*****************************************************************************
185  * Packetize:
186  *****************************************************************************/
187 static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
188 {
189     block_t *p_block, *p_spu;
190
191     if( pp_block == NULL || *pp_block == NULL ) return NULL;
192
193     p_block = *pp_block;
194     *pp_block = NULL;
195
196     if( !(p_spu = Reassemble( p_dec, p_block )) ) return NULL;
197
198     p_spu->i_dts = p_spu->i_pts;
199     p_spu->i_length = 0;
200
201     return p_spu;
202 }
203
204
205 /*****************************************************************************
206  Reassemble:
207
208  Data for single screen subtitle may come in several non-contiguous
209  packets of a stream. This routine is called when the next packet in
210  the stream comes in. The job of this routine is to parse the header,
211  if this is the beginning, and combine the packets into one complete
212  subtitle unit.
213
214  If everything is complete, we will return a block. Otherwise return
215  NULL.
216
217  *****************************************************************************/
218 #define SPU_HEADER_LEN 1
219
220 static block_t *Reassemble( decoder_t *p_dec, block_t *p_block )
221 {
222     decoder_sys_t *p_sys = p_dec->p_sys;
223
224     if( p_block->i_buffer < SPU_HEADER_LEN )
225     {
226         msg_Dbg( p_dec, "invalid packet header (size %zu < %u)" ,
227                  p_block->i_buffer, SPU_HEADER_LEN );
228         block_Release( p_block );
229         return NULL;
230     }
231
232     /* From the scant data on the format, there is only only way known
233      * to detect the first packet in a subtitle.  The first packet
234      * seems to have a valid PTS while later packets for the same
235      * image don't. */
236     if( p_sys->i_state == SUBTITLE_BLOCK_EMPTY && p_block->i_pts <= VLC_TS_INVALID )
237     {
238         msg_Warn( p_dec, "first packet expected but no PTS present");
239         return NULL;
240     }
241
242     p_block->p_buffer += SPU_HEADER_LEN;
243     p_block->i_buffer -= SPU_HEADER_LEN;
244
245     /* First packet in the subtitle block */
246     if( p_sys->i_state == SUBTITLE_BLOCK_EMPTY ) ParseHeader( p_dec, p_block );
247
248     block_ChainAppend( &p_sys->p_spu, p_block );
249     p_sys->p_spu = block_ChainGather( p_sys->p_spu );
250
251     if( p_sys->p_spu->i_buffer >= p_sys->i_spu_size )
252     {
253         block_t *p_spu = p_sys->p_spu;
254
255         if( p_spu->i_buffer != p_sys->i_spu_size )
256         {
257             msg_Warn( p_dec, "SPU packets size=%zu should be %zu",
258                       p_spu->i_buffer, p_sys->i_spu_size );
259         }
260
261         msg_Dbg( p_dec, "subtitle packet complete, size=%zuu", p_spu->i_buffer);
262
263         ParseMetaInfo( p_dec, p_spu );
264
265         p_sys->i_state = SUBTITLE_BLOCK_EMPTY;
266         p_sys->p_spu = 0;
267         return p_spu;
268     }
269     else
270     {
271         /* Not last block in subtitle, so wait for another. */
272         p_sys->i_state = SUBTITLE_BLOCK_PARTIAL;
273     }
274
275     return NULL;
276 }
277
278 /*
279   We do not have information on the subtitle format used on CVD's
280   except the submux sample code and a couple of samples of dubious
281   origin. Thus, this is the result of reading some code whose
282   correctness is not known and some experimentation.
283
284   CVD subtitles are different in several ways from SVCD OGT subtitles.
285   Image comes first and metadata is at the end.  So that the metadata
286   can be found easily, the subtitle packet starts with two bytes
287   (everything is big-endian again) that give the total size of the
288   subtitle data and the offset to the metadata - i.e. size of the
289   image data plus the four bytes at the beginning.
290
291   Image data comes interlaced is run-length encoded.  Each field is a
292   four-bit nibble. Each nibble contains a two-bit repeat count and a
293   two-bit color number so that up to three pixels can be described in
294   four bits.  The function of a 0 repeat count is unknown; it might be
295   used for RLE extension.  However when the full nibble is zero, the
296   rest of the line is filled with the color value in the next nibble.
297   It is unknown what happens if the color value is greater than three.
298   The rest seems to use a 4-entries palette.  It is not impossible
299   that the fill-line complete case above is not as described and the
300   zero repeat count means fill line.  The sample code never produces
301   this, so it may be untested.
302 */
303
304 static void ParseHeader( decoder_t *p_dec, block_t *p_block )
305 {
306     decoder_sys_t *p_sys = p_dec->p_sys;
307     uint8_t *p = p_block->p_buffer;
308
309     p_sys->i_spu_size = (p[0] << 8) + p[1] + 4; p += 2;
310
311     /* FIXME: check data sanity */
312     p_sys->metadata_offset = (p[0] <<  8) +   p[1]; p +=2;
313     p_sys->metadata_length = p_sys->i_spu_size - p_sys->metadata_offset;
314
315     p_sys->i_image_offset = 4;
316     p_sys->i_image_length = p_sys->metadata_offset - p_sys->i_image_offset;
317
318 #ifdef DEBUG_CVDSUB
319     msg_Dbg( p_dec, "total size: %zu  image size: %zu",
320              p_sys->i_spu_size, p_sys->i_image_length );
321 #endif
322 }
323
324 /*
325   We parse the metadata information here.
326
327   Although metadata information does not have to come in a fixed field
328   order, every metadata field consists of a tag byte followed by
329   parameters. In all cases known, the size including tag byte is
330   exactly four bytes in length.
331 */
332
333 #define ExtractXY(x, y) x = ((p[1]&0x0f)<<6) + (p[2]>>2); \
334                         y = ((p[2]&0x03)<<8) + p[3];
335
336 static void ParseMetaInfo( decoder_t *p_dec, block_t *p_spu  )
337 {
338     /* Last packet in subtitle block. */
339
340     decoder_sys_t *p_sys = p_dec->p_sys;
341     uint8_t       *p     = p_spu->p_buffer + p_sys->metadata_offset;
342     uint8_t       *p_end = p + p_sys->metadata_length;
343
344     for( ; p < p_end; p += 4 )
345     {
346         switch( p[0] )
347         {
348         case 0x04: /* subtitle duration in 1/90000ths of a second */
349             p_sys->i_duration = (p[1]<<16) + (p[2]<<8) + p[3];
350
351 #ifdef DEBUG_CVDSUB
352             msg_Dbg( p_dec, "subtitle display duration %lu secs",
353                      (long unsigned int)(p_sys->i_duration / 90000) );
354 #endif
355             p_sys->i_duration *= 100 / 9;
356             break;
357
358         case 0x0c: /* unknown */
359 #ifdef DEBUG_CVDSUB
360             msg_Dbg( p_dec, "subtitle command unknown 0x%0x 0x%0x 0x%0x 0x%0x",
361                      (int)p[0], (int)p[1], (int)p[2], (int)p[3] );
362 #endif
363             break;
364
365         case 0x17: /* coordinates of subtitle upper left x, y position */
366             ExtractXY(p_sys->i_x_start, p_sys->i_y_start);
367
368 #ifdef DEBUG_CVDSUB
369             msg_Dbg( p_dec, "start position (%d,%d)",
370                      p_sys->i_x_start, p_sys->i_y_start );
371 #endif
372             break;
373
374         case 0x1f: /* coordinates of subtitle bottom right x, y position */
375         {
376             int lastx;
377             int lasty;
378             ExtractXY(lastx, lasty);
379             p_sys->i_width  = lastx - p_sys->i_x_start + 1;
380             p_sys->i_height = lasty - p_sys->i_y_start + 1;
381
382 #ifdef DEBUG_CVDSUB
383             msg_Dbg( p_dec, "end position (%d,%d), w x h: %dx%d",
384                      lastx, lasty, p_sys->i_width, p_sys->i_height );
385 #endif
386             break;
387         }
388
389         case 0x24:
390         case 0x25:
391         case 0x26:
392         case 0x27:
393         {
394             uint8_t v = p[0] - 0x24;
395
396 #ifdef DEBUG_CVDSUB
397             /* Primary Palette */
398             msg_Dbg( p_dec, "primary palette %d (y,u,v): (0x%0x,0x%0x,0x%0x)",
399                      (int)v, (int)p[1], (int)p[2], (int)p[3] );
400 #endif
401
402             p_sys->p_palette[v][0] = p[1]; /* Y */
403             p_sys->p_palette[v][1] = p[3]; /* Cr / V */
404             p_sys->p_palette[v][2] = p[2]; /* Cb / U */
405             break;
406         }
407
408         case 0x2c:
409         case 0x2d:
410         case 0x2e:
411         case 0x2f:
412         {
413             uint8_t v = p[0] - 0x2c;
414
415 #ifdef DEBUG_CVDSUB
416             msg_Dbg( p_dec,"highlight palette %d (y,u,v): (0x%0x,0x%0x,0x%0x)",
417                      (int)v, (int)p[1], (int)p[2], (int)p[3] );
418 #endif
419
420             /* Highlight Palette */
421             p_sys->p_palette_highlight[v][0] = p[1]; /* Y */
422             p_sys->p_palette_highlight[v][1] = p[3]; /* Cr / V */
423             p_sys->p_palette_highlight[v][2] = p[2]; /* Cb / U */
424             break;
425         }
426
427         case 0x37:
428             /* transparency for primary palette */
429             p_sys->p_palette[0][3] = (p[3] & 0x0f) << 4;
430             p_sys->p_palette[1][3] = (p[3] >> 4) << 4;
431             p_sys->p_palette[2][3] = (p[2] & 0x0f) << 4;
432             p_sys->p_palette[3][3] = (p[2] >> 4) << 4;
433
434 #ifdef DEBUG_CVDSUB
435             msg_Dbg( p_dec, "transparency for primary palette 0..3: "
436                      "0x%0x 0x%0x 0x%0x 0x%0x",
437                      (int)p_sys->p_palette[0][3], (int)p_sys->p_palette[1][3],
438                      (int)p_sys->p_palette[2][3], (int)p_sys->p_palette[3][3]);
439 #endif
440             break;
441
442         case 0x3f:
443             /* transparency for highlight palette */
444             p_sys->p_palette_highlight[0][3] = (p[2] & 0x0f) << 4;
445             p_sys->p_palette_highlight[1][3] = (p[2] >> 4) << 4;
446             p_sys->p_palette_highlight[2][3] = (p[1] & 0x0f) << 4;
447             p_sys->p_palette_highlight[3][3] = (p[1] >> 4) << 4;
448
449 #ifdef DEBUG_CVDSUB
450             msg_Dbg( p_dec, "transparency for highlight palette 0..3: "
451                      "0x%0x 0x%0x 0x%0x 0x%0x",
452                      (int)p_sys->p_palette_highlight[0][3],
453                      (int)p_sys->p_palette_highlight[1][3],
454                      (int)p_sys->p_palette_highlight[2][3],
455                      (int)p_sys->p_palette_highlight[3][3] );
456 #endif
457             break;
458
459         case 0x47:
460             /* offset to start of even rows of interlaced image, we correct
461              * to make it relative to i_image_offset (usually 4) */
462             p_sys->first_field_offset =
463                 (p[2] << 8) + p[3] - p_sys->i_image_offset;
464 #ifdef DEBUG_CVDSUB
465             msg_Dbg( p_dec, "1st_field_offset %zu",
466                      p_sys->first_field_offset );
467 #endif
468             break;
469
470         case 0x4f:
471             /* offset to start of odd rows of interlaced image, we correct
472              * to make it relative to i_image_offset (usually 4) */
473             p_sys->second_field_offset =
474                 (p[2] << 8) + p[3] - p_sys->i_image_offset;
475 #ifdef DEBUG_CVDSUB
476             msg_Dbg( p_dec, "2nd_field_offset %zu",
477                      p_sys->second_field_offset);
478 #endif
479             break;
480
481         default:
482 #ifdef DEBUG_CVDSUB
483             msg_Warn( p_dec, "unknown sequence in control header "
484                       "0x%0x 0x%0x 0x%0x 0x%0x", p[0], p[1], p[2], p[3]);
485 #endif
486         }
487     }
488 }
489
490 /*****************************************************************************
491  * DecodePacket: parse and decode an SPU packet
492  *****************************************************************************
493  * This function parses and decodes an SPU packet and, if valid, returns a
494  * subpicture.
495  *****************************************************************************/
496 static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
497 {
498     decoder_sys_t *p_sys = p_dec->p_sys;
499     subpicture_t  *p_spu;
500     subpicture_region_t *p_region;
501     video_format_t fmt;
502     video_palette_t palette;
503     int i;
504
505     /* Allocate the subpicture internal data. */
506     p_spu = decoder_NewSubpicture( p_dec, NULL );
507     if( !p_spu ) return NULL;
508
509     p_spu->i_start = p_data->i_pts;
510     p_spu->i_stop  = p_data->i_pts + p_sys->i_duration;
511     p_spu->b_ephemer = true;
512
513     /* Create new SPU region */
514     memset( &fmt, 0, sizeof(video_format_t) );
515     fmt.i_chroma = VLC_CODEC_YUVP;
516     fmt.i_sar_num = 1;
517     fmt.i_sar_den = 1;
518     fmt.i_width = fmt.i_visible_width = p_sys->i_width;
519     fmt.i_height = fmt.i_visible_height = p_sys->i_height;
520     fmt.i_x_offset = fmt.i_y_offset = 0;
521     fmt.p_palette = &palette;
522     fmt.p_palette->i_entries = 4;
523     for( i = 0; i < fmt.p_palette->i_entries; i++ )
524     {
525         fmt.p_palette->palette[i][0] = p_sys->p_palette[i][0];
526         fmt.p_palette->palette[i][1] = p_sys->p_palette[i][1];
527         fmt.p_palette->palette[i][2] = p_sys->p_palette[i][2];
528         fmt.p_palette->palette[i][3] = p_sys->p_palette[i][3];
529     }
530
531     p_region = subpicture_region_New( &fmt );
532     if( !p_region )
533     {
534         msg_Err( p_dec, "cannot allocate SPU region" );
535         subpicture_Delete( p_spu );
536         return NULL;
537     }
538
539     p_spu->p_region = p_region;
540     p_region->i_x = p_sys->i_x_start;
541     p_region->i_x = p_region->i_x * 3 / 4; /* FIXME: use aspect ratio for x? */
542     p_region->i_y = p_sys->i_y_start;
543
544     RenderImage( p_dec, p_data, p_region );
545
546     return p_spu;
547 }
548
549 /*****************************************************************************
550  * ParseImage: parse and render the image part of the subtitle
551  *****************************************************************************
552  This part parses the subtitle graphical data and renders it.
553
554  Image data comes interlaced and is run-length encoded (RLE). Each
555  field is a four-bit nibbles that is further subdivided in a two-bit
556  repeat count and a two-bit color number - up to three pixels can be
557  described in four bits.  What a 0 repeat count means is unknown.  It
558  might be used for RLE extension.  There is a special case of a 0
559  repeat count though.  When the full nibble is zero, the rest of the
560  line is filled with the color value in the next nibble.  It is
561  unknown what happens if the color value is greater than three.  The
562  rest seems to use a 4-entries palette.  It is not impossible that the
563  fill-line complete case above is not as described and the zero repeat
564  count means fill line.  The sample code never produces this, so it
565  may be untested.
566
567  However we'll transform this so that that the RLE is expanded and
568  interlacing will also be removed. On output each pixel entry will by
569  a 4-bit alpha (filling 8 bits), and 8-bit y, u, and v entry.
570
571  *****************************************************************************/
572 static void RenderImage( decoder_t *p_dec, block_t *p_data,
573                          subpicture_region_t *p_region )
574 {
575     decoder_sys_t *p_sys = p_dec->p_sys;
576     uint8_t *p_dest = p_region->p_picture->Y_PIXELS;
577     int i_field;            /* The subtitles are interlaced */
578     int i_row, i_column;    /* scanline row/column number */
579     uint8_t i_color, i_count;
580     bs_t bs;
581
582     bs_init( &bs, p_data->p_buffer + p_sys->i_image_offset,
583              p_data->i_buffer - p_sys->i_image_offset );
584
585     for( i_field = 0; i_field < 2; i_field++ )
586     {
587         for( i_row = i_field; i_row < p_sys->i_height; i_row += 2 )
588         {
589             for( i_column = 0; i_column < p_sys->i_width; i_column++ )
590             {
591                 uint8_t i_val = bs_read( &bs, 4 );
592
593                 if( i_val == 0 )
594                 {
595                     /* Fill the rest of the line with next color */
596                     i_color = bs_read( &bs, 4 );
597
598                     memset( &p_dest[i_row * p_region->p_picture->Y_PITCH +
599                                     i_column], i_color,
600                             p_sys->i_width - i_column );
601                     i_column = p_sys->i_width;
602                     continue;
603                 }
604                 else
605                 {
606                     /* Normal case: get color and repeat count */
607                     i_count = (i_val >> 2);
608                     i_color = i_val & 0x3;
609
610                     i_count = __MIN( i_count, p_sys->i_width - i_column );
611
612                     memset( &p_dest[i_row * p_region->p_picture->Y_PITCH +
613                                     i_column], i_color, i_count );
614                     i_column += i_count - 1;
615                     continue;
616                 }
617             }
618
619             bs_align( &bs );
620         }
621     }
622 }