]> git.sesse.net Git - vlc/commitdiff
Scale bitmaps for 4:3 output
authorRocky Bernstein <rocky@videolan.org>
Sat, 27 Dec 2003 01:49:59 +0000 (01:49 +0000)
committerRocky Bernstein <rocky@videolan.org>
Sat, 27 Dec 2003 01:49:59 +0000 (01:49 +0000)
modules/codec/ogt/ogt.h
modules/codec/ogt/parse.c
modules/codec/ogt/render.c

index 46055a9df46112abf6d43c990ff7bfd6ddb147c0..e021f7c1cc380ddc37296d5cefbe7b4cba8c9438 100644 (file)
@@ -2,7 +2,7 @@
  * ogt.h : Overlay Graphics Text (SVCD subtitles) decoder thread interface
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: ogt.h,v 1.4 2003/12/26 02:47:59 rocky Exp $
+ * $Id: ogt.h,v 1.5 2003/12/27 01:49:59 rocky Exp $
  *
  * Author: Rocky Bernstein
  *   based on code from:
@@ -28,7 +28,8 @@
 #define DECODE_DBG_CALL        2 /* all calls */
 #define DECODE_DBG_PACKET      4 /* packet assembly info */
 #define DECODE_DBG_IMAGE       8 /* image bitmaps */
-#define DECODE_DBG_INFO       16
+#define DECODE_DBG_TRANSFORM  16 /* bitmap transformations */
+#define DECODE_DBG_INFO       32
 
 #define DECODE_DEBUG 1
 #if DECODE_DEBUG
index 9e3e3b3a1d316c8e745dd20c53104f1047d24817..da2695eacc7400de5e3e1b78a3a1deb31b100aa0 100644 (file)
@@ -2,7 +2,7 @@
  * parse.c: Philips OGT (SVCD subtitle) packet parser
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: parse.c,v 1.1 2003/12/26 01:39:23 rocky Exp $
+ * $Id: parse.c,v 1.2 2003/12/27 01:49:59 rocky Exp $
  *
  * Authors: Rocky Bernstein 
  *   based on code from: 
@@ -240,43 +240,73 @@ ExtractField(uint8_t *p, unsigned int i_remaining)
   return ( ( *p >> 2*(i_remaining-1) ) & 0x3 );
 }
 
-#ifdef FINISHED
 /* Scales down (reduces size) of p_dest in the x direction as 
    determined through aspect ratio x_scale by y_scale. Scaling
-   is done in place. i_width, is updated to new ratio.
+   is done in place. p_spu->i_width, is updated to new width
 
-   The aspect ratio is assumed to be between 1 and 2.
+   The aspect ratio is assumed to be between 1/2 and 1.
 */
 static void
-ScaleX( uint8_t *p_dest, /*in out */ u_int16_t *i_width, u_int16_t i_height,
-       unsigned int scale_x, unsigned int scale_y )
+ScaleX( decoder_t *p_dec, subpicture_t *p_spu, 
+       unsigned int i_scale_x, unsigned int i_scale_y )
 {
   int i_row, i_col;
-  uint8_t *p1 = p_dest;
-  uint8_t *p2 = p_dest + PIXEL_SIZE;
+
+  decoder_sys_t *p_sys = p_dec->p_sys;
+  uint8_t *p_src1 = p_spu->p_sys->p_data;
+  uint8_t *p_src2 = p_src1 + PIXEL_SIZE;
+  uint8_t *p_dst  = p_src1;
+  unsigned int i_new_width = (p_spu->i_width * i_scale_x) / i_scale_y ;
+  unsigned int used=0;  /* Number of bytes used up in p_src1. */
+
+  dbg_print( (DECODE_DBG_CALL|DECODE_DBG_TRANSFORM) , 
+            "Old width: %d, new width: %d", 
+            p_spu->i_width, i_new_width);
   
-  unsigned int used=0;  /* Number of bytes used up in p1. */
+  for ( i_row=0; i_row <= p_spu->i_height - 1; i_row++ ) {
 
-  for ( i_row=0; i_row < i_height - 1; i_row++ ) {
-    for ( i_col=0; i_col <= (*i_width)-2; i_col++ ) {
+    if (used != 0) {
+      /* Discard the remaining piece of the colum of the previous line*/
+      used=0;
+      p_src1 = p_src2;
+      p_src2 += PIXEL_SIZE;
+    }
+    
+    for ( i_col=0; i_col <= p_spu->i_width - 2; i_col++ ) {
       unsigned int i;
-      unsigned int w1= scale_x - used;
-      unsigned int w2= scale_y - w1;
+      unsigned int w1= i_scale_x - used;
+      unsigned int w2= i_scale_y - w1;
+
       used = w2;
       for (i = 0; i < PIXEL_SIZE; i++ ) {
-       *p1 = ( (*p1 * w1) + (*p2 * w2) ) / scale_y;
-       p1++; p2++;
+       *p_dst = ( (*p_src1 * w1) + (*p_src2 * w2) ) / i_scale_y;
+       p_src1++; p_src2++; p_dst++;
       }
-      if (scale_x == used) {
-       p1 = p2;
-       p2 += PIXEL_SIZE;
+
+      if (i_scale_x == used) {
+       /* End of last pixel was end of p_src2. */
+       p_src1 = p_src2;
+       p_src2 += PIXEL_SIZE;
+       i_col++;
        used = 0;
       }
     }
   }
-  /* *i_width = ((*i_width) * scale_y)  / scale_x; */
+  p_spu->i_width = i_new_width;
+
+  if ( p_sys && p_sys->i_debug & DECODE_DBG_TRANSFORM )
+  { 
+    ogt_yuvt_t *p_source = (ogt_yuvt_t *) p_spu->p_sys->p_data;
+    for ( i_row=0; i_row < p_spu->i_height - 1; i_row++ ) {
+      for ( i_col=0; i_col < p_spu->i_width - 1; i_col++ ) {
+       printf("%1x", p_source->t);
+       p_source++;
+      }
+      printf("\n");
+    }
+  }
+
 }
-#endif
 
 /*****************************************************************************
  * ParseImage: parse the image part of the subtitle
@@ -395,14 +425,12 @@ ParseImage( decoder_t *p_dec, subpicture_t * p_spu )
       }
     }
 
-#ifdef FINISHED
     /* The video is automatically scaled. However subtitle bitmaps
        assume a 1:1 aspect ratio. So we need to scale to compensate for
        or undo the effects of video output scaling. 
     */
     /* FIXME do the right scaling depending on vout. It may not be 4:3 */
-    ScaleX( p_dest, &(p_sys->i_width), i_height, 3, 4 );
-#endif
+    ScaleX( p_dec, p_spu, 3, 4 );
 
     return VLC_SUCCESS;
 }
index bfae81ec6a3f195dcd90b52ab7e518bc4a3f25b8..8f65d8ddba1a9bd170a9c346896571bcb4614a58 100644 (file)
@@ -2,7 +2,7 @@
  * render.c : Philips OGT (SVCD Subtitle) renderer
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: render.c,v 1.1 2003/12/26 01:39:35 rocky Exp $
+ * $Id: render.c,v 1.2 2003/12/27 01:49:59 rocky Exp $
  *
  * Author: Rocky Bernstein 
  *   based on code from: 
@@ -55,9 +55,9 @@ void E_(RenderSPU)( vout_thread_t *p_vout, picture_t *p_pic,
                     const subpicture_t *p_spu )
 {
 
-#ifndef FINISHED
-    printf("+++%x\n", p_vout->output.i_chroma);
-#endif
+    /*
+      printf("+++%x\n", p_vout->output.i_chroma);
+    */
   
     switch( p_vout->output.i_chroma )
     {