]> git.sesse.net Git - vlc/blobdiff - modules/codec/theora.c
cdda/info: fix memleaks.
[vlc] / modules / codec / theora.c
index 812baa96e117e71fd552f9127d0a287e9ad6b84b..88e14c0aa685f20706f6704e82fab7662f1dbdb8 100644 (file)
@@ -28,7 +28,7 @@
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_codec.h>
 #include <vlc_vout.h>
@@ -101,18 +101,18 @@ vlc_module_begin();
     set_category( CAT_INPUT );
     set_subcategory( SUBCAT_INPUT_VCODEC );
     set_shortname( "Theora" );
-    set_description( _("Theora video decoder") );
+    set_description( N_("Theora video decoder") );
     set_capability( "decoder", 100 );
     set_callbacks( OpenDecoder, CloseDecoder );
     add_shortcut( "theora" );
 
     add_submodule();
-    set_description( _("Theora video packetizer") );
+    set_description( N_("Theora video packetizer") );
     set_capability( "packetizer", 100 );
     set_callbacks( OpenPacketizer, CloseDecoder );
 
     add_submodule();
-    set_description( _("Theora video encoder") );
+    set_description( N_("Theora video encoder") );
     set_capability( "encoder", 150 );
     set_callbacks( OpenEncoder, CloseEncoder );
 
@@ -121,7 +121,7 @@ vlc_module_begin();
                  ENC_QUALITY_LONGTEXT, false );
 vlc_module_end();
 
-static const char *ppsz_enc_options[] = {
+static const char *const ppsz_enc_options[] = {
     "quality", NULL
 };
 
@@ -283,12 +283,33 @@ static int ProcessHeaders( decoder_t *p_dec )
     }
 
     /* Set output properties */
+    switch( p_sys->ti.pixelformat )
+    {
+      case OC_PF_420:
+        p_dec->fmt_out.i_codec = VLC_FOURCC( 'I','4','2','0' );
+        break;
+      case OC_PF_422:
+        p_dec->fmt_out.i_codec = VLC_FOURCC( 'I','4','2','2' );
+        break;
+      case OC_PF_444:
+        p_dec->fmt_out.i_codec = VLC_FOURCC( 'I','4','4','4' );
+        break;
+      case OC_PF_RSVD:
+      default:
+        msg_Err( p_dec, "unknown chroma in theora sample" );
+        break;
+    }
     p_dec->fmt_out.video.i_width = p_sys->ti.width;
     p_dec->fmt_out.video.i_height = p_sys->ti.height;
     if( p_sys->ti.frame_width && p_sys->ti.frame_height )
     {
-        p_dec->fmt_out.video.i_width = p_sys->ti.frame_width;
-        p_dec->fmt_out.video.i_height = p_sys->ti.frame_height;
+        p_dec->fmt_out.video.i_visible_width = p_sys->ti.frame_width;
+        p_dec->fmt_out.video.i_visible_height = p_sys->ti.frame_height;
+        if( p_sys->ti.offset_x || p_sys->ti.offset_y )
+        {
+            p_dec->fmt_out.video.i_x_offset = p_sys->ti.offset_x;
+            p_dec->fmt_out.video.i_y_offset = p_sys->ti.offset_y;
+        }
     }
 
     if( p_sys->ti.aspect_denominator && p_sys->ti.aspect_numerator )
@@ -538,30 +559,19 @@ static void CloseDecoder( vlc_object_t *p_this )
 static void theora_CopyPicture( decoder_t *p_dec, picture_t *p_pic,
                                 yuv_buffer *yuv )
 {
-    int i_plane, i_line, i_width, i_dst_stride, i_src_stride;
-    int i_src_xoffset, i_src_yoffset;
+    int i_plane, i_line, i_dst_stride, i_src_stride;
     uint8_t *p_dst, *p_src;
 
     for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ )
     {
         p_dst = p_pic->p[i_plane].p_pixels;
         p_src = i_plane ? (i_plane - 1 ? yuv->v : yuv->u ) : yuv->y;
-        i_width = p_pic->p[i_plane].i_visible_pitch;
         i_dst_stride  = p_pic->p[i_plane].i_pitch;
         i_src_stride  = i_plane ? yuv->uv_stride : yuv->y_stride;
-        i_src_xoffset = p_dec->p_sys->ti.offset_x;
-        i_src_yoffset = p_dec->p_sys->ti.offset_y;
-        if( i_plane )
-        {
-            i_src_xoffset /= 2;
-            i_src_yoffset /= 2;
-        }
-
-        p_src += (i_src_yoffset * i_src_stride + i_src_xoffset);
 
-        for( i_line = 0; i_line < p_pic->p[i_plane].i_visible_lines; i_line++ )
+        for( i_line = 0; i_line < p_pic->p[i_plane].i_lines; i_line++ )
         {
-            vlc_memcpy( p_dst, p_src + i_src_xoffset,
+            vlc_memcpy( p_dst, p_src,
                         i_plane ? yuv->uv_width : yuv->y_width );
             p_src += i_src_stride;
             p_dst += i_dst_stride;