]> git.sesse.net Git - vlc/blobdiff - modules/stream_out/transcode.c
* modules/gui/wxwindows/*: misc fixes.
[vlc] / modules / stream_out / transcode.c
index 8fc4e4732d80ac74098333daf5f3ebfacb69cd8d..c611dd8459290cf7c170f008749d167904bce2f0 100644 (file)
@@ -2,7 +2,7 @@
  * transcode.c
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: transcode.c,v 1.12 2003/05/03 14:22:47 fenrir Exp $
+ * $Id: transcode.c,v 1.15 2003/05/04 18:51:34 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -81,6 +81,9 @@ struct sout_stream_sys_t
     int             i_width;
     int             i_height;
     int             i_key_int;
+    int             i_qmin;
+    int             i_qmax;
+    vlc_bool_t      b_hq;
     vlc_bool_t      b_deinterlace;
 
     int             i_crop_top;
@@ -112,6 +115,9 @@ static int Open( vlc_object_t *p_this )
     p_sys->i_width      = 0;
     p_sys->i_height     = 0;
     p_sys->i_key_int    = -1;
+    p_sys->i_qmin       = 2;
+    p_sys->i_qmax       = 31;
+    p_sys->b_hq         = VLC_FALSE;
     p_sys->b_deinterlace= VLC_FALSE;
 
     p_sys->i_crop_top   = 0;
@@ -139,6 +145,10 @@ static int Open( vlc_object_t *p_this )
         if( ( val = sout_cfg_find_value( p_stream->p_cfg, "ab" ) ) )
         {
             p_sys->i_abitrate = atoi( val );
+            if( p_sys->i_abitrate < 4000 )
+            {
+                p_sys->i_abitrate *= 1000;
+            }
         }
 
         msg_Dbg( p_stream, "codec audio=%4.4s %dHz %d channels %dKb/s",
@@ -201,6 +211,18 @@ static int Open( vlc_object_t *p_this )
         {
             p_sys->i_key_int    = atoi( val );
         }
+        if( sout_cfg_find( p_stream->p_cfg, "hq" ) )
+        {
+            p_sys->b_hq = VLC_TRUE;
+        }
+        if( ( val = sout_cfg_find_value( p_stream->p_cfg, "qmin" ) ) )
+        {
+            p_sys->i_qmin   = atoi( val );
+        }
+        if( ( val = sout_cfg_find_value( p_stream->p_cfg, "qmax" ) ) )
+        {
+            p_sys->i_qmax   = atoi( val );
+        }
 
         msg_Dbg( p_stream, "codec video=%4.4s %dx%d %dkb/s",
                  fcc,
@@ -667,8 +689,8 @@ static int transcode_audio_ffmpeg_process( sout_stream_t *p_stream, sout_stream_
     }
     else
     {
-        int16_t *sout = (int16_t*)&id->p_buffer[id->i_buffer_pos];
-        int     i_used;
+        int16_t *sout  = (int16_t*)&id->p_buffer[id->i_buffer_pos];
+        int     i_used = 0;
 
         if( id->f_src.i_fourcc == VLC_FOURCC( 's', '8', ' ', ' ' ) )
         {
@@ -891,8 +913,12 @@ static int transcode_video_ffmpeg_new   ( sout_stream_t *p_stream, sout_stream_i
     {
         id->ff_enc_c->bit_rate_tolerance = p_sys->i_vtolerance;
     }
-    id->ff_enc_c->qmin           = 2;
-    id->ff_enc_c->qmax           = 31;
+    id->ff_enc_c->qmin           = p_sys->i_qmin;
+    id->ff_enc_c->qmax           = p_sys->i_qmax;
+    if( p_sys->b_hq )
+    {
+        id->ff_enc_c->flags      |= CODEC_FLAG_HQ;
+    }
 
     if( i_ff_codec == CODEC_ID_RAWVIDEO )
     {
@@ -965,6 +991,7 @@ static void transcode_video_ffmpeg_close ( sout_stream_t *p_stream, sout_stream_
 static int transcode_video_ffmpeg_process( sout_stream_t *p_stream, sout_stream_id_t *id,
                                            sout_buffer_t *in, sout_buffer_t **out )
 {
+    sout_stream_sys_t   *p_sys = p_stream->p_sys;
     int     i_used;
     int     i_out;
     int     b_gotpicture;
@@ -1018,11 +1045,13 @@ static int transcode_video_ffmpeg_process( sout_stream_t *p_stream, sout_stream_
                detecting size */
             if( id->ff_enc_c->width <= 0 )
             {
-                id->ff_enc_c->width  = id->f_dst.i_width  = id->ff_dec_c->width;
+                id->ff_enc_c->width    =
+                    id->f_dst.i_width  = id->ff_dec_c->width - p_sys->i_crop_left - p_sys->i_crop_right;
             }
             if( id->ff_enc_c->height <= 0 )
             {
-                id->ff_enc_c->height = id->f_dst.i_height = id->ff_dec_c->height;
+                id->ff_enc_c->height   =
+                    id->f_dst.i_height = id->ff_dec_c->height - p_sys->i_crop_top - p_sys->i_crop_bottom;
             }
 
             if( avcodec_open( id->ff_enc_c, id->ff_enc ) )
@@ -1093,8 +1122,10 @@ static int transcode_video_ffmpeg_process( sout_stream_t *p_stream, sout_stream_
         }
 
         /* convert size and crop */
-        if( ( id->ff_dec_c->width  != id->ff_enc_c->width ) ||
-            ( id->ff_dec_c->height != id->ff_enc_c->height ) )
+        if( id->ff_dec_c->width  != id->ff_enc_c->width ||
+            id->ff_dec_c->height != id->ff_enc_c->height ||
+            p_sys->i_crop_top > 0 || p_sys->i_crop_bottom > 0 ||
+            p_sys->i_crop_left > 0 || p_sys->i_crop_right )
         {
             if( id->p_ff_pic_tmp2 == NULL )
             {