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 );
return VLC_ENOMEM;
p_dec->p_sys->b_packetizer = false;
- p_sys->i_pts = 0;
+ p_sys->i_pts = VLC_TS_INVALID;
p_sys->b_decoded_first_keyframe = false;
/* Set output properties */
/* 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;
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_dec->fmt_out.video.i_width ) /
- ( p_sys->ti.aspect_denominator * p_dec->fmt_out.video.i_height );
+ p_dec->fmt_out.video.i_sar_num = p_sys->ti.aspect_numerator;
+ p_dec->fmt_out.video.i_sar_den = p_sys->ti.aspect_denominator;
}
else
{
- p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR *
- p_sys->ti.frame_width / p_sys->ti.frame_height;
+ p_dec->fmt_out.video.i_sar_num = 1;
+ p_dec->fmt_out.video.i_sar_den = 1;
}
if( p_sys->ti.fps_numerator > 0 && p_sys->ti.fps_denominator > 0 )
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 );
}
}
/* Date management */
- if( p_block->i_pts > 0 && p_block->i_pts != p_sys->i_pts )
+ if( p_block->i_pts > VLC_TS_INVALID && p_block->i_pts != p_sys->i_pts )
{
p_sys->i_pts = p_block->i_pts;
}
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;
* 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;
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 &&
}
/* 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;
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;
p_sys->ti.fps_denominator = p_enc->fmt_in.video.i_frame_rate_base;
}
- if( p_enc->fmt_in.video.i_aspect )
+ if( p_enc->fmt_in.video.i_sar_num > 0 && p_enc->fmt_in.video.i_sar_den > 0 )
{
- 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_ureduce( &i_dst_num, &i_dst_den, i_num, i_den, 0 );
+ vlc_ureduce( &i_dst_num, &i_dst_den,
+ p_enc->fmt_in.video.i_sar_num,
+ p_enc->fmt_in.video.i_sar_den, 0 );
p_sys->ti.aspect_numerator = i_dst_num;
p_sys->ti.aspect_denominator = i_dst_den;
}
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 */
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;
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;
}