Commit 70520eab authored by Laurent Aimar's avatar Laurent Aimar

* transcode:

    - added new HQ mode (recent ffmpeg only). hq now accept "simple",
      "bits" and "rd" as paramters.
    - automaticaly try stereo mode encoding when failed with more
      than 2 channels. (eg a52 -> mpga)
parent d5642697
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* transcode.c * transcode.c
***************************************************************************** *****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN * Copyright (C) 2001, 2002 VideoLAN
* $Id: transcode.c,v 1.27 2003/07/28 20:25:30 jpsaman Exp $ * $Id: transcode.c,v 1.28 2003/07/30 02:00:58 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -91,7 +91,7 @@ struct sout_stream_sys_t ...@@ -91,7 +91,7 @@ struct sout_stream_sys_t
int i_key_int; int i_key_int;
int i_qmin; int i_qmin;
int i_qmax; int i_qmax;
vlc_bool_t b_hq; vlc_bool_t i_hq;
vlc_bool_t b_deinterlace; vlc_bool_t b_deinterlace;
int i_crop_top; int i_crop_top;
...@@ -125,7 +125,11 @@ static int Open( vlc_object_t *p_this ) ...@@ -125,7 +125,11 @@ static int Open( vlc_object_t *p_this )
p_sys->i_key_int = -1; p_sys->i_key_int = -1;
p_sys->i_qmin = 2; p_sys->i_qmin = 2;
p_sys->i_qmax = 31; p_sys->i_qmax = 31;
p_sys->b_hq = VLC_FALSE; #if LIBAVCODEC_BUILD >= 4673
p_sys->i_hq = FF_MB_DECISION_SIMPLE;
#else
p_sys->i_hq = VLC_FALSE;
#endif
p_sys->b_deinterlace= VLC_FALSE; p_sys->b_deinterlace= VLC_FALSE;
p_sys->i_crop_top = 0; p_sys->i_crop_top = 0;
...@@ -218,10 +222,32 @@ static int Open( vlc_object_t *p_this ) ...@@ -218,10 +222,32 @@ static int Open( vlc_object_t *p_this )
{ {
p_sys->i_key_int = atoi( val ); p_sys->i_key_int = atoi( val );
} }
#if LIBAVCODEC_BUILD >= 4673
if( ( val = sout_cfg_find_value( p_stream->p_cfg, "hq" ) ) )
{
if( !strcmp( val, "rd" ) )
{
p_sys->i_hq = FF_MB_DECISION_RD;
}
else if( !strcmp( val, "bits" ) )
{
p_sys->i_hq = FF_MB_DECISION_BITS;
}
else if( !strcmp( val, "simple" ) )
{
p_sys->i_hq = FF_MB_DECISION_SIMPLE;
}
else
{
p_sys->i_hq = FF_MB_DECISION_RD;
}
}
#else
if( sout_cfg_find( p_stream->p_cfg, "hq" ) ) if( sout_cfg_find( p_stream->p_cfg, "hq" ) )
{ {
p_sys->b_hq = VLC_TRUE; p_sys->i_hq = VLC_TRUE;
} }
#endif
if( ( val = sout_cfg_find_value( p_stream->p_cfg, "qmin" ) ) ) if( ( val = sout_cfg_find_value( p_stream->p_cfg, "qmin" ) ) )
{ {
p_sys->i_qmin = atoi( val ); p_sys->i_qmin = atoi( val );
...@@ -590,14 +616,14 @@ static int transcode_audio_ffmpeg_new( sout_stream_t *p_stream, ...@@ -590,14 +616,14 @@ static int transcode_audio_ffmpeg_new( sout_stream_t *p_stream,
i_ff_codec = get_ff_codec( id->f_src.i_fourcc ); i_ff_codec = get_ff_codec( id->f_src.i_fourcc );
if( i_ff_codec == 0 ) if( i_ff_codec == 0 )
{ {
msg_Err( p_stream, "cannot find decoder" ); msg_Err( p_stream, "cannot find decoder id" );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
id->ff_dec = avcodec_find_decoder( i_ff_codec ); id->ff_dec = avcodec_find_decoder( i_ff_codec );
if( !id->ff_dec ) if( !id->ff_dec )
{ {
msg_Err( p_stream, "cannot find decoder" ); msg_Err( p_stream, "cannot find decoder (avcodec)" );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -666,31 +692,47 @@ static int transcode_audio_ffmpeg_new( sout_stream_t *p_stream, ...@@ -666,31 +692,47 @@ static int transcode_audio_ffmpeg_new( sout_stream_t *p_stream,
i_ff_codec = get_ff_codec( id->f_dst.i_fourcc ); i_ff_codec = get_ff_codec( id->f_dst.i_fourcc );
if( i_ff_codec == 0 ) if( i_ff_codec == 0 )
{ {
msg_Err( p_stream, "cannot find encoder" ); msg_Err( p_stream, "cannot find encoder id" );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
id->ff_enc = avcodec_find_encoder( i_ff_codec ); id->ff_enc = avcodec_find_encoder( i_ff_codec );
if( !id->ff_enc ) if( !id->ff_enc )
{ {
msg_Err( p_stream, "cannot find encoder" ); msg_Err( p_stream, "cannot find encoder (avcodec)" );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
/* Hack for mp3 transcoding support */ /* Hack for mp3 transcoding support */
if( id->f_dst.i_fourcc == VLC_FOURCC( 'm','p','3',' ' ) ) if( id->f_dst.i_fourcc == VLC_FOURCC( 'm','p','3',' ' ) )
{
id->f_dst.i_fourcc = VLC_FOURCC( 'm','p','g','a' ); id->f_dst.i_fourcc = VLC_FOURCC( 'm','p','g','a' );
}
id->ff_enc_c = avcodec_alloc_context(); id->ff_enc_c = avcodec_alloc_context();
id->ff_enc_c->bit_rate = id->f_dst.i_bitrate; id->ff_enc_c->bit_rate = id->f_dst.i_bitrate;
id->ff_enc_c->sample_rate = id->f_dst.i_sample_rate; id->ff_enc_c->sample_rate = id->f_dst.i_sample_rate;
id->ff_enc_c->channels = id->f_dst.i_channels; id->ff_enc_c->channels = id->f_dst.i_channels;
if( avcodec_open( id->ff_enc_c, id->ff_enc ) )
{
if( id->ff_enc_c->channels > 2 )
{
id->ff_enc_c->channels = 2;
id->f_dst.i_channels = 2;
if( avcodec_open( id->ff_enc_c, id->ff_enc ) ) if( avcodec_open( id->ff_enc_c, id->ff_enc ) )
{ {
msg_Err( p_stream, "cannot open encoder" ); msg_Err( p_stream, "cannot open encoder" );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
msg_Warn( p_stream, "stereo mode selected (codec limitation)" );
}
else
{
msg_Err( p_stream, "cannot open encoder" );
return VLC_EGENERIC;
}
}
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -1010,8 +1052,7 @@ static int transcode_audio_ffmpeg_process( sout_stream_t *p_stream, ...@@ -1010,8 +1052,7 @@ static int transcode_audio_ffmpeg_process( sout_stream_t *p_stream,
{ {
for( j = 0 ; j < id->f_dst.i_channels; j++ ) for( j = 0 ; j < id->f_dst.i_channels; j++ )
{ {
p_buffer[i*id->f_dst.i_channels+j] = p_buffer[i*id->f_dst.i_channels+j] = p_buffer[i*id->f_src.i_channels+j];
p_buffer[i*id->f_src.i_channels+j];
} }
} }
} }
...@@ -1169,10 +1210,15 @@ static int transcode_video_ffmpeg_new( sout_stream_t *p_stream, ...@@ -1169,10 +1210,15 @@ static int transcode_video_ffmpeg_new( sout_stream_t *p_stream,
} }
id->ff_enc_c->qmin = p_sys->i_qmin; id->ff_enc_c->qmin = p_sys->i_qmin;
id->ff_enc_c->qmax = p_sys->i_qmax; id->ff_enc_c->qmax = p_sys->i_qmax;
if( p_sys->b_hq )
#if LIBAVCODEC_BUILD >= 4673
id->ff_enc_c->mb_decision = p_sys->i_hq;
#else
if( p_sys->i_hq )
{ {
id->ff_enc_c->flags |= CODEC_FLAG_HQ; id->ff_enc_c->flags |= CODEC_FLAG_HQ;
} }
#endif
if( i_ff_codec == CODEC_ID_RAWVIDEO ) if( i_ff_codec == CODEC_ID_RAWVIDEO )
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment