X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Ftheora.c;h=0815212b66aae5b9674931bd561ff50f60faa161;hb=7b8d1ebafa15cd87fa885d3958640492c36182c3;hp=934c6839e5e4721a83471255d904aadcce2d739e;hpb=c5c06b64c806052086e5772d64e540a8db7e4a9b;p=vlc diff --git a/modules/codec/theora.c b/modules/codec/theora.c index 934c6839e5..0815212b66 100644 --- a/modules/codec/theora.c +++ b/modules/codec/theora.c @@ -82,7 +82,7 @@ static void *ProcessPacket ( decoder_t *, ogg_packet *, block_t ** ); static picture_t *DecodePacket( decoder_t *, ogg_packet * ); static void ParseTheoraComments( decoder_t * ); -static void theora_CopyPicture( decoder_t *, picture_t *, yuv_buffer * ); +static void theora_CopyPicture( picture_t *, yuv_buffer * ); static int OpenEncoder( vlc_object_t *p_this ); static void CloseEncoder( vlc_object_t *p_this ); @@ -215,9 +215,8 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) /* Backup headers as extra data */ uint8_t *p_extra; - p_dec->fmt_in.p_extra = - realloc( p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra + - oggpacket.bytes + 2 ); + p_dec->fmt_in.p_extra = xrealloc( p_dec->fmt_in.p_extra, + p_dec->fmt_in.i_extra + oggpacket.bytes + 2 ); p_extra = ((uint8_t *)p_dec->fmt_in.p_extra) + p_dec->fmt_in.i_extra; *(p_extra++) = oggpacket.bytes >> 8; *(p_extra++) = oggpacket.bytes & 0xFF; @@ -404,8 +403,8 @@ static int ProcessHeaders( decoder_t *p_dec ) else { p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra; - p_dec->fmt_out.p_extra = - realloc( p_dec->fmt_out.p_extra, p_dec->fmt_out.i_extra ); + p_dec->fmt_out.p_extra = xrealloc( p_dec->fmt_out.p_extra, + p_dec->fmt_out.i_extra ); memcpy( p_dec->fmt_out.p_extra, p_dec->fmt_in.p_extra, p_dec->fmt_out.i_extra ); } @@ -498,7 +497,7 @@ static picture_t *DecodePacket( decoder_t *p_dec, ogg_packet *p_oggpacket ) p_pic = decoder_NewPicture( p_dec ); if( !p_pic ) return NULL; - theora_CopyPicture( p_dec, p_pic, &yuv ); + theora_CopyPicture( p_pic, &yuv ); p_pic->date = p_sys->i_pts; @@ -553,7 +552,7 @@ static void CloseDecoder( vlc_object_t *p_this ) * theora_CopyPicture: copy a picture from theora internal buffers to a * picture_t structure. *****************************************************************************/ -static void theora_CopyPicture( decoder_t *p_dec, picture_t *p_pic, +static void theora_CopyPicture( picture_t *p_pic, yuv_buffer *yuv ) { int i_plane, i_line, i_dst_stride, i_src_stride; @@ -602,10 +601,9 @@ struct encoder_sys_t static int OpenEncoder( vlc_object_t *p_this ) { encoder_t *p_enc = (encoder_t *)p_this; - encoder_sys_t *p_sys = p_enc->p_sys; + encoder_sys_t *p_sys; ogg_packet header; uint8_t *p_extra; - vlc_value_t val; int i_quality, i; if( p_enc->fmt_out.i_codec != VLC_CODEC_THEORA && @@ -615,7 +613,7 @@ static int OpenEncoder( vlc_object_t *p_this ) } /* Allocate the memory needed to store the decoder's structure */ - if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL ) + if( ( p_sys = malloc(sizeof(encoder_sys_t)) ) == NULL ) return VLC_ENOMEM; p_enc->p_sys = p_sys; @@ -625,8 +623,7 @@ static int OpenEncoder( vlc_object_t *p_this ) 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; + i_quality = var_GetInteger( p_enc, ENC_CFG_PREFIX "quality" ); if( i_quality > 10 ) i_quality = 10; if( i_quality < 0 ) i_quality = 0; @@ -698,7 +695,6 @@ static int OpenEncoder( vlc_object_t *p_this ) p_sys->ti.noise_sensitivity = 1; theora_encode_init( &p_sys->td, &p_sys->ti ); - theora_info_clear( &p_sys->ti ); theora_comment_init( &p_sys->tc ); /* Create and store headers */ @@ -709,9 +705,8 @@ static int OpenEncoder( vlc_object_t *p_this ) else if( i == 1 ) theora_encode_comment( &p_sys->tc, &header ); else if( i == 2 ) theora_encode_tables( &p_sys->td, &header ); - p_enc->fmt_out.p_extra = - realloc( p_enc->fmt_out.p_extra, - p_enc->fmt_out.i_extra + header.bytes ); + p_enc->fmt_out.p_extra = xrealloc( p_enc->fmt_out.p_extra, + p_enc->fmt_out.i_extra + header.bytes ); p_extra = p_enc->fmt_out.p_extra; p_extra += p_enc->fmt_out.i_extra + (i-3)*2; p_enc->fmt_out.i_extra += header.bytes; @@ -819,6 +814,11 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict ) memcpy( p_block->p_buffer, oggpacket.packet, oggpacket.bytes ); p_block->i_dts = p_block->i_pts = p_pict->date; + if( theora_packet_iskeyframe( &oggpacket ) ) + { + p_block->i_flags |= BLOCK_FLAG_TYPE_I; + } + return p_block; }