]> git.sesse.net Git - vlc/blobdiff - modules/codec/rawvideo.c
* modules/demux/mp4/mp4.c: set fmt.video.i_bits_per_pixel (needed at least for QT...
[vlc] / modules / codec / rawvideo.c
index 6f4d53086a926a800444c9ea99fdacf3cd9a4295..c5e9767c2a23e5a6e931b676725f23a4d94327d5 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * rawvideo.c: Pseudo video decoder/packetizer for raw video data
  *****************************************************************************
- * Copyright (C) 2001, 2002 VideoLAN
+ * Copyright (C) 2001, 2002 the VideoLAN team
  * $Id$
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
@@ -67,6 +67,8 @@ static block_t   *SendFrame  ( decoder_t *, block_t * );
 vlc_module_begin();
     set_description( _("Pseudo raw video decoder") );
     set_capability( "decoder", 50 );
+    set_category( CAT_INPUT );
+    set_subcategory( SUBCAT_INPUT_VCODEC );
     set_callbacks( OpenDecoder, CloseDecoder );
 
     add_submodule();
@@ -106,6 +108,10 @@ static int OpenDecoder( vlc_object_t *p_this )
         case VLC_FOURCC('R','V','1','5'):
             break;
 
+        case VLC_FOURCC('y','v','1','2'):
+            p_dec->fmt_in.i_codec = VLC_FOURCC('Y','V','1','2');
+            break;
+
         default:
             return VLC_EGENERIC;
     }
@@ -301,6 +307,49 @@ static block_t *SendFrame( decoder_t *p_dec, block_t *p_block )
 
     p_block->i_dts = p_block->i_pts = p_sys->i_pts;
 
+    if( p_sys->b_invert )
+    {
+        picture_t pic;
+        uint8_t *p_tmp, *p_pixels;
+        int i, j;
+
+        /* Fill in picture_t fields */
+        vout_InitPicture( VLC_OBJECT(p_dec), &pic, p_dec->fmt_out.i_codec,
+                          p_dec->fmt_out.video.i_width,
+                          p_dec->fmt_out.video.i_height, VOUT_ASPECT_FACTOR );
+
+        if( !pic.i_planes )
+        {
+            msg_Err( p_dec, "unsupported chroma" );
+            return p_block;
+        }
+
+        p_tmp = malloc( pic.p[0].i_visible_pitch );
+        p_pixels = p_block->p_buffer;
+        for( i = 0; i < pic.i_planes; i++ )
+        {
+            int i_pitch = pic.p[i].i_visible_pitch;
+            uint8_t *p_top = p_pixels;
+            uint8_t *p_bottom = p_pixels + i_pitch *
+                (pic.p[i].i_visible_lines - 1);
+
+            for( j = 0; j < pic.p[i].i_visible_lines / 2; j++ )
+            {
+                p_dec->p_vlc->pf_memcpy( p_tmp, p_bottom,
+                                         pic.p[i].i_visible_pitch  );
+                p_dec->p_vlc->pf_memcpy( p_bottom, p_top,
+                                         pic.p[i].i_visible_pitch  );
+                p_dec->p_vlc->pf_memcpy( p_top, p_tmp,
+                                         pic.p[i].i_visible_pitch  );
+                p_top += i_pitch;
+                p_bottom -= i_pitch;
+            }
+
+            p_pixels += i_pitch * pic.p[i].i_lines;
+        }
+        free( p_tmp );
+    }
+
     return p_block;
 }