]> git.sesse.net Git - vlc/blobdiff - modules/codec/theora.c
* modules/codec/dirac.c: dirac decoder/encoder module based on libdirac (http://www...
[vlc] / modules / codec / theora.c
index 70bd0750e436d653953efa510b61a599d48795b2..32289431a30225f91842b0f6a5979b0e2b91b19a 100644 (file)
@@ -88,6 +88,8 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict );
   "of specifying a particular bitrate. This will produce a VBR stream." )
 
 vlc_module_begin();
+    set_category( CAT_INPUT );
+    set_subcategory( SUBCAT_INPUT_VCODEC );
     set_description( _("Theora video decoder") );
     set_capability( "decoder", 100 );
     set_callbacks( OpenDecoder, CloseDecoder );
@@ -294,6 +296,12 @@ static int ProcessHeaders( decoder_t *p_dec )
             p_sys->ti.frame_width / p_sys->ti.frame_height;
     }
 
+    if( p_sys->ti.fps_numerator > 0 && p_sys->ti.fps_denominator > 0 )
+    {
+        p_dec->fmt_out.video.i_frame_rate = p_sys->ti.fps_numerator;
+        p_dec->fmt_out.video.i_frame_rate_base = p_sys->ti.fps_denominator;
+    }
+
     msg_Dbg( p_dec, "%dx%d %.02f fps video, frame content "
              "is %dx%d with offset (%d,%d)",
              p_sys->ti.width, p_sys->ti.height,
@@ -595,7 +603,7 @@ static int OpenEncoder( vlc_object_t *p_this )
     p_sys->ti.frame_width = p_enc->fmt_in.video.i_width;
     p_sys->ti.frame_height = p_enc->fmt_in.video.i_height;
     p_sys->ti.offset_x = 0 /*frame_x_offset*/;
-    p_sys->ti.offset_y = 0/*frame_y_offset*/;
+    p_sys->ti.offset_y = 0 /*frame_y_offset*/;
 
     p_sys->i_width = p_sys->ti.width;
     p_sys->i_height = p_sys->ti.height;
@@ -614,9 +622,14 @@ static int OpenEncoder( vlc_object_t *p_this )
 
     if( p_enc->fmt_in.video.i_aspect )
     {
-        p_sys->ti.aspect_numerator =
-            p_enc->fmt_in.video.i_aspect * p_sys->ti.height / p_sys->ti.width;
-        p_sys->ti.aspect_denominator = VOUT_ASPECT_FACTOR;
+        int64_t i_num, i_den;
+        int i_dst_num, i_dst_den;
+
+        i_num = p_enc->fmt_in.video.i_aspect * (int64_t)p_sys->ti.height;
+        i_den = VOUT_ASPECT_FACTOR * p_sys->ti.width;
+        vlc_reduce( &i_dst_num, &i_dst_den, i_num, i_den, 0 );
+        p_sys->ti.aspect_numerator = i_dst_num;
+        p_sys->ti.aspect_denominator = i_dst_den;
     }
     else
     {