* ALL: separation of the SPU engine from the VOUT.
[vlc.git] / modules / codec / ogt / common.c
index fcf0c40..e12aebf 100644 (file)
@@ -1,10 +1,10 @@
 /*****************************************************************************
- * Common SVCD and VCD subtitle routines.
+ * Common SVCD and CVD subtitle routines.
  *****************************************************************************
  * Copyright (C) 2003, 2004 VideoLAN
- * $Id: common.c,v 1.8 2004/01/16 13:32:37 rocky Exp $
+ * $Id$
  *
- * Author: Rocky Bernstein
+ * Author: Rocky Bernstein <rocky@panix.com>
  *   based on code from:
  *       Julio Sanchez Fernandez (http://subhandler.sourceforge.net)
  *       Samuel Hocevar <sam@zoy.org>
@@ -49,26 +49,11 @@ void VCDSubClose( vlc_object_t *p_this )
 
     dbg_print( (DECODE_DBG_CALL|DECODE_DBG_EXT) , "");
 
-    if( !p_sys->b_packetizer )
+    if( !p_sys->b_packetizer && p_sys->p_vout )
     {
         /* FIXME check if it's ok to not lock vout */
-        if( p_sys->p_vout != NULL && p_sys->p_vout->p_subpicture != NULL )
-        {
-            subpicture_t *  p_subpic;
-            int             i_subpic;
-
-            for( i_subpic = 0; i_subpic < VOUT_MAX_SUBPICTURES; i_subpic++ )
-            {
-                p_subpic = &p_sys->p_vout->p_subpicture[i_subpic];
-
-                if( p_subpic != NULL &&
-                    ( ( p_subpic->i_status == RESERVED_SUBPICTURE ) ||
-                      ( p_subpic->i_status == READY_SUBPICTURE ) ) )
-                {
-                    vout_DestroySubPicture( p_sys->p_vout, p_subpic );
-                }
-            }
-        }
+        spu_Control( p_sys->p_vout->p_spu, SPU_CHANNEL_CLEAR,
+                     p_sys->i_subpic_channel );
     }
 
     if( p_sys->p_block )
@@ -76,6 +61,7 @@ void VCDSubClose( vlc_object_t *p_this )
         block_ChainRelease( p_sys->p_block );
     }
 
+    free(p_sys->subtitle_data);
     free( p_sys );
 }
 
@@ -348,7 +334,7 @@ VCDSubHandleScaling( subpicture_t *p_spu, decoder_t *p_dec )
   vlc_object_t * p_input = p_spu->p_sys->p_input;
   vout_thread_t *p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, 
                                            FIND_CHILD );
-  unsigned int i_aspect_x, i_aspect_y;
+  int i_aspect_x, i_aspect_y;
   uint8_t *p_dest = (uint8_t *)p_spu->p_sys->p_data;
 
   if (p_vout) {
@@ -379,14 +365,17 @@ VCDSubHandleScaling( subpicture_t *p_spu, decoder_t *p_dec )
         */
         switch( p_vout->output.i_chroma )
           {
-            /* chromas which are not scaled: */
+            /* chromas in which scaling is done outside of our
+               blending routine, so we need to compensate for those
+               effects before blending gets called: */
           case VLC_FOURCC('I','4','2','0'):
           case VLC_FOURCC('I','Y','U','V'):
           case VLC_FOURCC('Y','V','1','2'):
           case VLC_FOURCC('Y','U','Y','2'):
             break;
             
-            /* chromas which are scaled: */
+            /* chromas in which scaling is done in our blending 
+               routine and thus we don't do it here: */
           case VLC_FOURCC('R','V','1','6'):
           case VLC_FOURCC('R','V','2','4'):
           case VLC_FOURCC('R','V','3','2'):
@@ -401,11 +390,12 @@ VCDSubHandleScaling( subpicture_t *p_spu, decoder_t *p_dec )
             break;
           }
         /* We get here only for scaled chromas. */
-        vout_AspectRatio( p_vout->render.i_aspect, &i_aspect_y, 
-                          &i_aspect_x );
+        vlc_reduce( &i_aspect_x, &i_aspect_y, p_vout->render.i_aspect,
+                    VOUT_ASPECT_FACTOR, 0 );
       } else {
         /* User knows best? */
-        vout_AspectRatio( i_new_aspect, &i_aspect_x, &i_aspect_y );
+        vlc_reduce( &i_aspect_x, &i_aspect_y, p_vout->render.i_aspect,
+                    VOUT_ASPECT_FACTOR, 0 );
       }
       VCDSubScaleX( p_dec, p_spu, i_aspect_x, i_aspect_y );
     }
@@ -486,28 +476,8 @@ void VCDSubDumpImage( uint8_t *p_image, uint32_t i_height, uint32_t i_width )
   printf("\n-------------------------------------\n");
 }
 
-/***************************************************
-   Color conversion from
-    http://www.inforamp.net/~poynton/notes/colour_and_gamma/ColorFAQ.html#RTFToC30
-    http://people.ee.ethz.ch/~buc/brechbuehler/mirror/color/ColorFAQ.html
-    Thanks to Billy Biggs <vektor@dumbterm.net> for the pointer and
-    the following conversion.
-    R' = [ 1.1644         0    1.5960 ]   ([ Y' ]   [  16 ])
-    G' = [ 1.1644   -0.3918   -0.8130 ] * ([ Cb ] - [ 128 ])
-    B' = [ 1.1644    2.0172         0 ]   ([ Cr ]   [ 128 ])
-
-  See also vlc/modules/video_chroma/i420_rgb.h and
-  vlc/modules/video_chroma/i420_rgb_c.h for a way to do this in a way
-  more optimized for integer arithmetic. Would be nice to merge the
-  two routines.
-***************************************************/
-
 #ifdef HAVE_LIBPNG
 
-#define BYTES_PER_RGB 3
 #define PALETTE_SIZE  4
 /* Note the below assumes the above is a power of 2 */
 #define PALETTE_SIZE_MASK (PALETTE_SIZE-1)
@@ -526,11 +496,11 @@ VCDSubDumpPNG( uint8_t *p_image, decoder_t *p_dec,
 {
   decoder_sys_t *p_sys = p_dec->p_sys;
   uint8_t *p = p_image;
-  uint8_t *image_data = malloc(BYTES_PER_RGB * i_height * i_width );
+  uint8_t *image_data = malloc(RGB_SIZE * i_height * i_width );
   uint8_t *q = image_data;
   unsigned int i_row;    /* scanline row number */
   unsigned int i_column; /* scanline column number */
-  uint8_t rgb_palette[PALETTE_SIZE * BYTES_PER_RGB];
+  uint8_t rgb_palette[PALETTE_SIZE * RGB_SIZE];
   int i;
 
   dbg_print( (DECODE_DBG_CALL), "%s", filename);
@@ -540,14 +510,14 @@ VCDSubDumpPNG( uint8_t *p_image, decoder_t *p_dec,
   /* Convert palette YUV into RGB. */
   for (i=0; i<PALETTE_SIZE; i++) {
     ogt_yuvt_t *p_yuv     = &(p_sys->p_palette[i]);
-    uint8_t   *p_rgb_out  = &(rgb_palette[i*BYTES_PER_RGB]);
+    uint8_t   *p_rgb_out  = &(rgb_palette[i*RGB_SIZE]);
     yuv2rgb( p_yuv, p_rgb_out );
   }
   
   /* Convert palette entries into linear RGB array. */
   for ( i_row=0; i_row < i_height; i_row ++ ) {
     for ( i_column=0; i_column<i_width; i_column++ ) {
-      uint8_t *p_rgb = &rgb_palette[ ((*p)&PALETTE_SIZE_MASK)*BYTES_PER_RGB ];
+      uint8_t *p_rgb = &rgb_palette[ ((*p)&PALETTE_SIZE_MASK)*RGB_SIZE ];
       *q++ = p_rgb[0];
       *q++ = p_rgb[1];
       *q++ = p_rgb[2];