X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Ftheora.c;h=93badbf1ec9df138a088a5e2336c90e4a33b7702;hb=5a605a9ff03e5266b56991d969c8c23f4e303906;hp=92fb2796a783d5db9e0d792575c3a2edbe5308e6;hpb=827129ddfeca9426634b8ac98c0659257354ec94;p=vlc diff --git a/modules/codec/theora.c b/modules/codec/theora.c index 92fb2796a7..93badbf1ec 100644 --- a/modules/codec/theora.c +++ b/modules/codec/theora.c @@ -1,7 +1,7 @@ /***************************************************************************** * theora.c: theora decoder module making use of libtheora. ***************************************************************************** - * Copyright (C) 1999-2001 VideoLAN + * Copyright (C) 1999-2001 the VideoLAN team * $Id$ * * Authors: Gildas Bazin @@ -18,17 +18,17 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ #include -#include -#include -#include - +#include +#include +#include +#include #include #include @@ -89,12 +89,13 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict ); *****************************************************************************/ #define ENC_QUALITY_TEXT N_("Encoding quality") #define ENC_QUALITY_LONGTEXT N_( \ - "Allows you to specify a quality between 1 (low) and 10 (high), instead " \ + "Enforce a quality between 1 (low) and 10 (high), instead " \ "of specifying a particular bitrate. This will produce a VBR stream." ) vlc_module_begin(); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_VCODEC ); + set_shortname( "Theora" ); set_description( _("Theora video decoder") ); set_capability( "decoder", 100 ); set_callbacks( OpenDecoder, CloseDecoder ); @@ -108,7 +109,7 @@ vlc_module_begin(); add_submodule(); set_description( _("Theora video encoder") ); - set_capability( "encoder", 100 ); + set_capability( "encoder", 150 ); set_callbacks( OpenEncoder, CloseEncoder ); add_shortcut( "theora" ); @@ -277,7 +278,7 @@ static int ProcessHeaders( decoder_t *p_dec ) if( theora_decode_header( &p_sys->ti, &p_sys->tc, &oggpacket ) < 0 ) { - msg_Err( p_dec, "This bitstream does not contain Theora video data" ); + msg_Err( p_dec, "this bitstream does not contain Theora video data" ); return VLC_EGENERIC; } @@ -293,8 +294,8 @@ static int ProcessHeaders( decoder_t *p_dec ) if( p_sys->ti.aspect_denominator && p_sys->ti.aspect_numerator ) { p_dec->fmt_out.video.i_aspect = ((int64_t)VOUT_ASPECT_FACTOR) * - ( p_sys->ti.aspect_numerator * p_sys->ti.width ) / - ( p_sys->ti.aspect_denominator * p_sys->ti.height ); + ( p_sys->ti.aspect_numerator * p_dec->fmt_out.video.i_width ) / + ( p_sys->ti.aspect_denominator * p_dec->fmt_out.video.i_height ); } else { @@ -315,6 +316,21 @@ static int ProcessHeaders( decoder_t *p_dec ) p_sys->ti.frame_width, p_sys->ti.frame_height, p_sys->ti.offset_x, p_sys->ti.offset_y ); + /* Sanity check that seems necessary for some corrupted files */ + if( p_sys->ti.width < p_sys->ti.frame_width || + p_sys->ti.height < p_sys->ti.frame_height ) + { + msg_Warn( p_dec, "trying to correct invalid theora header " + "(frame size (%dx%d) is smaller than frame content (%d,%d))", + p_sys->ti.width, p_sys->ti.height, + p_sys->ti.frame_width, p_sys->ti.frame_height ); + + if( p_sys->ti.width < p_sys->ti.frame_width ) + p_sys->ti.width = p_sys->ti.frame_width; + if( p_sys->ti.height < p_sys->ti.frame_height ) + p_sys->ti.height = p_sys->ti.frame_height; + } + /* The next packet in order is the comments header */ oggpacket.b_o_s = 0; oggpacket.bytes = *(p_extra++) << 8; @@ -386,7 +402,7 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket, block_t *p_block = *pp_block; void *p_buf; - if( ( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY ) != 0 ) + if( ( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) != 0 ) { /* Don't send the the first packet after a discontinuity to * theora_decode, otherwise we get purple/green display artifacts @@ -541,11 +557,11 @@ static void theora_CopyPicture( decoder_t *p_dec, picture_t *p_pic, i_src_yoffset /= 2; } - p_src += (i_src_yoffset * i_src_stride + i_src_yoffset); + 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++ ) { - p_dec->p_vlc->pf_memcpy( p_dst, p_src + i_src_xoffset, + p_dec->p_libvlc->pf_memcpy( p_dst, p_src + i_src_xoffset, i_plane ? yuv->uv_width : yuv->y_width ); p_src += i_src_stride; p_dst += i_dst_stride; @@ -603,7 +619,7 @@ static int OpenEncoder( vlc_object_t *p_this ) p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0'); p_enc->fmt_out.i_codec = VLC_FOURCC('t','h','e','o'); - sout_CfgParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg ); + config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg ); var_Get( p_enc, ENC_CFG_PREFIX "quality", &val ); i_quality = val.i_int; @@ -649,12 +665,12 @@ static int OpenEncoder( vlc_object_t *p_this ) if( p_enc->fmt_in.video.i_aspect ) { - int64_t i_num, i_den; - int i_dst_num, i_dst_den; + uint64_t i_num, i_den; + unsigned 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 ); + vlc_ureduce( &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; }