ed427b86b1c2a0aec1c2535a17f31573ee3def28
[vlc.git] / modules / codec / ogt / cvd_parse.c
1 /*****************************************************************************
2  * parse.c: Philips OGT (SVCD subtitle) packet parser
3  *****************************************************************************
4  * Copyright (C) 2003 VideoLAN
5  * $Id: cvd_parse.c,v 1.1 2003/12/28 04:51:52 rocky Exp $
6  *
7  * Authors: Rocky Bernstein 
8  *   based on code from: 
9  *       Julio Sanchez Fernandez (http://subhandler.sourceforge.net)
10  *       Sam Hocevar <sam@zoy.org>
11  *       Laurent Aimar <fenrir@via.ecp.fr>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
26  *****************************************************************************/
27
28 /*****************************************************************************
29  * Preamble
30  *****************************************************************************/
31 #include <vlc/vlc.h>
32 #include <vlc/vout.h>
33 #include <vlc/decoder.h>
34
35 #include "subtitle.h"
36 #include "render.h"
37 #include "cvd.h"
38
39 /* An image color is a two-bit palette entry: 0..3 */ 
40 typedef uint8_t ogt_color_t;
41
42 /*****************************************************************************
43  * Local prototypes.
44  *****************************************************************************/
45 static int  ParseImage         ( decoder_t *, subpicture_t * );
46
47 /*
48  * We do not have information on the subtitle format used on CVD's
49  * except the submux sample code and a couple of samples of dubious
50  * origin. Thus, this is the result of reading some code whose
51  * correctness is not known and some experimentation.
52  * 
53  * CVD subtitles present several differences compared to SVCD OGT
54  * subtitles.  Firstly, the image comes first and the metadata is at
55  * the end.  So that the metadata can be found easily, the subtitle
56  * begins with two two-byte (everything is big-endian again) that
57  * describe, the total size of the subtitle data and the offset to the
58  * metadata (size of the image data plus the four bytes at the
59  * beginning.
60  *
61  * Image data comes interlaced and uses RLE.  Coding is based in
62  * four-bit nibbles that are further subdivided in a two-bit repeat
63  * count and a two-bit color number so that up to three pixels can be
64  * describe with a total of four bits.  The function of a 0 repeat
65  * count is unknown.  It might be used for RLE extension.  There is a
66  * special case, though.  When the full nibble is zero, the rest of
67  * the line is filled with the color value in the next nibble.  It is
68  * unknown what happens if the color value is greater than three.  The
69  * rest seems to use a 4-entries palette.  It is not impossible that
70  * the fill-line complete case above is not as described and the zero
71  * repeat count means fill line.  The sample code never produces this,
72  * so it may be untested.
73  *
74  * The metadata section does not follow a fixed pattern, every
75  * metadata item consists of a tag byte followed by parameters. In all
76  * cases known, the block (including the tag byte) is exactly four
77  * bytes in length.  Read the code for the rest.
78  */
79
80 /* FIXME: do we really need p_buffer and p? 
81    Can't all of thes _offset's and _lengths's get removed? 
82 */
83 void E_(ParseHeader)( decoder_t *p_dec, uint8_t *p_buffer, block_t *p_block )
84 {
85   decoder_sys_t *p_sys = p_dec->p_sys;
86
87   dbg_print( (DECODE_DBG_CALL|DECODE_DBG_EXT) , "");
88
89   /* To be finished...*/
90   return;
91 }
92
93
94 /*****************************************************************************
95  * ParsePacket: parse an SPU packet and send it to the video output
96  *****************************************************************************
97  * This function parses the SPU packet and, if valid, sends it to the
98  * video output.
99  *****************************************************************************/
100 void 
101 E_(ParsePacket)( decoder_t *p_dec)
102 {
103     decoder_sys_t *p_sys = p_dec->p_sys;
104
105     dbg_print( (DECODE_DBG_CALL|DECODE_DBG_EXT) , "");
106
107     /* To be completed... */
108     return;
109
110 }
111
112 /* Advance pointer to image pointer, update internal i_remaining counter
113    and check that we haven't goine too far  in the image data. */
114 #define advance_color_pointer_byte                                      \
115   p++;                                                                  \
116   i_remaining=4;                                                        \
117   if (p >= maxp) {                                                      \
118     msg_Warn( p_dec,                                                    \
119               "broken subtitle - tried to access beyond end "           \
120               "in image extraction");                                   \
121     return VLC_EGENERIC;                                                \
122   }                                                                     \
123
124 #define advance_color_pointer                                           \
125   i_remaining--;                                                        \
126   if ( i_remaining == 0 ) {                                             \
127     advance_color_pointer_byte;                                         \
128   }                                                                     
129
130 /* Get the next field - either a palette index or a RLE count for
131    color 0.  To do this we use byte image pointer p, and i_remaining
132    which indicates where we are in the byte.
133 */
134 static inline ogt_color_t 
135 ExtractField(uint8_t *p, unsigned int i_remaining) 
136 {
137   return ( ( *p >> 2*(i_remaining-1) ) & 0x3 );
138 }
139
140 /*****************************************************************************
141  * ParseImage: parse the image part of the subtitle
142  *****************************************************************************
143  This part parses the subtitle graphical data and stores it in a more
144  convenient structure for later rendering. 
145
146  The image is encoded using two bits per pixel that select a palette
147  entry except that value 0 starts a limited run-length encoding for
148  color 0.  When 0 is seen, the next two bits encode one less than the
149  number of pixels, so we can encode run lengths from 1 to 4. These get
150  filled with the color in palette entry 0.
151
152  The encoding of each line is padded to a whole number of bytes.  The
153  first field is padded to an even byte length and the complete subtitle
154  is padded to a 4-byte multiple that always include one zero byte at
155  the end.
156
157  However we'll transform this so that that the RLE is expanded and
158  interlacing will also be removed. On output each pixel entry will by 
159  an 8-bit alpha, y, u, and v entry.
160
161  *****************************************************************************/
162 static int 
163 ParseImage( decoder_t *p_dec, subpicture_t * p_spu )
164 {
165     decoder_sys_t *p_sys = p_dec->p_sys;
166
167     dbg_print( (DECODE_DBG_CALL) , "");
168     /* To be finished...*/
169     return VLC_EGENERIC;
170
171 }
172